/ Hex Artifact Content
Login

Artifact 05cb666b7e30e8d9f1bda9abcf2cfe510193864fd2508c2dc98f5b99726d0eb8:


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 23 69 66  ED_CACHE */..#if
3e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e50: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a  _CONCURRENT./*.*
3e60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e70: 73 74 72 75 63 74 75 72 65 20 2d 20 42 74 72 65  structure - Btre
3e80: 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72 65 73  ePtrmap - stores
3e90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
3ea0: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 75 73  ointer map.** us
3eb0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61 6c 6c  ed for newly all
3ec0: 6f 63 61 74 65 64 20 70 61 67 65 73 20 69 6e 20  ocated pages in 
3ed0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
3ee0: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3ef0: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3f00: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3f10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3f20: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3f30: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3f40: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3f50: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3f60: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3f70: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3f80: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3f90: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3fa0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fb0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3fc0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fd0: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3fe0: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3ff0: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
4000: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
4010: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
4020: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
4030: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
4040: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
4050: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4070: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
4080: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
4090: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
40c0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
40d0: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
40e0: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4100: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
4110: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
4120: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4140: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
4150: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
4160: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
4190: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
41a0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
41d0: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
41e0: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
41f0: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
4200: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4210: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
4220: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
4230: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4260: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4270: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
4280: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
4290: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
42a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
42b0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
42c0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64  ies */.};../* !d
42d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
42e0: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
42f0: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
4300: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
4310: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4320: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
4330: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
4340: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
4350: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
4360: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
4390: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
43a0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
43b0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
43c0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
43d0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
43e0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
43f0: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4400: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4410: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4420: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4430: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4440: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4460: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4470: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
4490: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
44a0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
44b0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
44c0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
44d0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
44e0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
44f0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4500: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4510: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4520: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4530: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4550: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4570: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4580: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
4590: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
45a0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
45b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
45c0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
45d0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
45e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
45f0: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4600: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4610: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4630: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4640: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4650: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4660: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4670: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4680: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
4690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
46a0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
46b0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
46c0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
46d0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
46e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
46f0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4700: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4710: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4720: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4730: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4740: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4750: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4760: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4770: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4780: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4790: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
47c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
47d0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
47e0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
47f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4800: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4810: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4840: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4850: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4860: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4870: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4880: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
4890: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
48a0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
48b0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
48c0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
48d0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
48e0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
48f0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4900: 6f 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ollback++;.    }
4910: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
4920: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4930: 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50   */.    pMap->aP
4940: 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e  tr[iEntry].paren
4950: 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  t = parent;.    
4960: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4970: 79 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65  y].eType = eType
4980: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
49b0: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
49c0: 29 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76  ).**.** Open sav
49d0: 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
49e0: 74 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  t, if it is not 
49f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f  already open..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4a10: 65 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53  ePtrmapBegin(BtS
4a20: 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
4a30: 6e 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  nSvpt){.  BtreeP
4a40: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4a50: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4a60: 4d 61 70 20 26 26 20 6e 53 76 70 74 3e 70 4d 61  Map && nSvpt>pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
4a90: 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70  Svpt>=pMap->nSvp
4aa0: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  tAlloc ){.      
4ab0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4ac0: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d  >nSvptAlloc ? pM
4ad0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32  ap->nSvptAlloc*2
4ae0: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74   : 16;.      int
4af0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
4b00: 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61  _realloc(pMap->a
4b10: 53 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Svpt, sizeof(int
4b20: 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ) * nNew);.     
4b30: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b70: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20    pMap->aSvpt = 
4b80: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4b90: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d  ap->nSvptAlloc =
4ba0: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4bb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
4bc0: 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e  pMap->nSvpt; i<n
4bd0: 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Svpt; i++){.    
4be0: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d    pMap->aSvpt[i]
4bf0: 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61   = pMap->nRollba
4c00: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  ck;.    }.    pM
4c10: 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70  ap->nSvpt = nSvp
4c20: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4c40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c50: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c60: 54 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  T).**.** Rollbac
4c70: 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f  k (if op==SAVEPO
4c80: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72  INT_ROLLBACK) or
4c90: 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d   release (if op=
4ca0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4cb0: 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  SE).** savepoint
4cc0: 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   iSvpt..*/.stati
4cd0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d  c void btreePtrm
4ce0: 61 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a  apEnd(BtShared *
4cf0: 70 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  pBt, int op, int
4d00: 20 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65   iSvpt){.  Btree
4d10: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4d20: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4d30: 70 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  pMap ){.    asse
4d40: 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
4d50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70  T_ROLLBACK || op
4d60: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4d70: 41 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ASE );.    asser
4d80: 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28  t( iSvpt>=0 || (
4d90: 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  iSvpt==-1 && op=
4da0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4db0: 41 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ACK) );.    if( 
4dc0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20  iSvpt<0 ){.     
4dd0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30   pMap->nSvpt = 0
4de0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4df0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
4e00: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e     memset(pMap->
4e10: 61 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aPtr, 0, sizeof(
4e20: 50 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50  Pgno) * pMap->nP
4e30: 74 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65  trAlloc);.    }e
4e40: 6c 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d  lse if( iSvpt<pM
4e50: 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20  ap->nSvpt ){.   
4e60: 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
4e70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
4e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4e90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ea0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d  pMap->nRollback-
4eb0: 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76  1; ii>=pMap->aSv
4ec0: 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29  pt[iSvpt]; ii--)
4ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c  {.          Roll
4ee0: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4ef0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4f00: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ii];.          P
4f10: 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
4f20: 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
4f30: 5b 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d  [p->pgno - pMap-
4f40: 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  >iFirst];.      
4f50: 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65      pEntry->pare
4f60: 6e 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a  nt = p->parent;.
4f70: 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
4f80: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
4f90: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70      }.      pMap
4fb0: 2d 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20  ->nSvpt = iSvpt 
4fc0: 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
4fd0: 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
4fe0: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4ff0: 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b  k = pMap->aSvpt[
5000: 69 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20  iSvpt];.    }.  
5010: 7d 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64  }.}../* !defined
5020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e  (SQLITE_OMIT_CON
5030: 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54  CURRENT).**.** T
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5050: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
5060: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
5070: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
5080: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
5090: 61 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65  ase. It allocate
50a0: 73 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  s the BtreePtrma
50b0: 70 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  p structure used
50c0: 20 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65   to track pointe
50d0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  rs.** to allocat
50e0: 65 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72  ed pages and zer
50f0: 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
5100: 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
5110: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
5120: 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31  header on page 1
5130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5140: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5150: 61 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ate(BtShared *pB
5160: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5180: 70 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  pBt->pMap==0 ){.
5190: 20 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20      BtreePtrmap 
51a0: 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f  *pMap = sqlite3_
51b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  malloc(sizeof(Bt
51c0: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
51d0: 20 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a   if( pMap==0 ){.
51e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
51f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
5210: 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
5220: 44 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a  Data[32], 0, siz
5230: 65 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20  eof(u32)*2);.   
5240: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20     memset(pMap, 
5250: 30 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  0, sizeof(BtreeP
5260: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70  trmap));.      p
5270: 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42  Map->iFirst = pB
5280: 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20  t->nPage + 1;.  
5290: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
52a0: 70 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pMap;.    }.  }.
52b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
52e0: 4e 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61  NT).**.** Free a
52f0: 6e 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  ny BtreePtrmap s
5300: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
5310: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
5320: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65   call to.** btre
5330: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
5340: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5350: 64 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c  d btreePtrmapDel
5360: 65 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ete(BtShared *pB
5370: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
5380: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
5390: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
53a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
53b0: 72 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62  ree(pMap->aRollb
53c0: 61 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ack);.    sqlite
53d0: 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74  3_free(pMap->aPt
53e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
53f0: 66 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74  free(pMap->aSvpt
5400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5410: 72 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70  ree(pMap);.    p
5420: 42 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20  Bt->pMap = 0;.  
5430: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  }.}../*.** Check
5440: 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
5450: 72 2d 6d 61 70 20 64 6f 65 73 20 6e 6f 74 20 63  r-map does not c
5460: 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
5470: 65 73 20 77 69 74 68 20 61 20 70 61 72 65 6e 74  es with a parent
5480: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 30 2e 20 43  .** page of 0. C
5490: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
54a0: 29 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  ) multiple times
54b0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 65   to output the e
54c0: 6e 74 69 72 65 0a 2a 2a 20 64 61 74 61 20 73 74  ntire.** data st
54d0: 72 75 63 74 75 72 65 20 69 66 20 69 74 20 64 6f  ructure if it do
54e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
54f0: 69 64 20 62 74 72 65 65 50 74 72 6d 61 70 43 68  id btreePtrmapCh
5500: 65 63 6b 28 42 74 53 68 61 72 65 64 20 2a 70 42  eck(BtShared *pB
5510: 74 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  t, Pgno nPage){.
5520: 20 20 50 67 6e 6f 20 69 3b 0a 20 20 69 6e 74 20    Pgno i;.  int 
5530: 62 50 72 6f 62 6c 65 6d 20 3d 20 30 3b 0a 20 20  bProblem = 0;.  
5540: 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 20 3d  BtreePtrmap *p =
5550: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 0a 20 20 66   pBt->pMap;..  f
5560: 6f 72 28 69 3d 70 2d 3e 69 46 69 72 73 74 3b 20  or(i=p->iFirst; 
5570: 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
5580: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
5590: 2a 70 45 6e 74 72 79 20 3d 20 26 70 2d 3e 61 50  *pEntry = &p->aP
55a0: 74 72 5b 69 2d 70 2d 3e 69 46 69 72 73 74 5d 3b  tr[i-p->iFirst];
55b0: 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d  .    if( pEntry-
55c0: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f  >eType==PTRMAP_O
55d0: 56 45 52 46 4c 4f 57 31 0a 20 20 20 20 20 7c 7c  VERFLOW1.     ||
55e0: 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d   pEntry->eType==
55f0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
5600: 0a 20 20 20 20 20 7c 7c 20 70 45 6e 74 72 79 2d  .     || pEntry-
5610: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42  >eType==PTRMAP_B
5620: 54 52 45 45 0a 20 20 20 20 29 7b 0a 20 20 20 20  TREE.    ){.    
5630: 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 70 61    if( pEntry->pa
5640: 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
5650: 20 20 20 62 50 72 6f 62 6c 65 6d 20 3d 20 31 3b     bProblem = 1;
5660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5680: 7d 0a 0a 20 20 69 66 28 20 62 50 72 6f 62 6c 65  }..  if( bProble
5690: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  m ){.    for(i=p
56a0: 2d 3e 69 46 69 72 73 74 3b 20 69 3c 3d 6e 50 61  ->iFirst; i<=nPa
56b0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
56c0: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e  PtrmapEntry *pEn
56d0: 74 72 79 20 3d 20 26 70 2d 3e 61 50 74 72 5b 69  try = &p->aPtr[i
56e0: 2d 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20  -p->iFirst];.   
56f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5700: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 0a  QLITE_CORRUPT, .
5710: 20 20 20 20 20 20 20 20 20 20 22 62 74 72 65 65            "btree
5720: 50 74 72 6d 61 70 43 68 65 63 6b 3a 20 70 67 6e  PtrmapCheck: pgn
5730: 6f 3d 25 64 20 65 54 79 70 65 3d 25 64 20 70 61  o=%d eType=%d pa
5740: 72 65 6e 74 3d 25 64 22 2c 20 0a 20 20 20 20 20  rent=%d", .     
5750: 20 20 20 20 20 28 69 6e 74 29 69 2c 20 28 69 6e       (int)i, (in
5760: 74 29 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c  t)pEntry->eType,
5770: 20 28 69 6e 74 29 70 45 6e 74 72 79 2d 3e 70 61   (int)pEntry->pa
5780: 72 65 6e 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  rent.      );.  
5790: 20 20 7d 0a 20 20 20 20 61 62 6f 72 74 28 29 3b    }.    abort();
57a0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 20 20 2f  .  }.}..#else  /
57b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
57c0: 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 23 20 64 65  NCURRENT */.# de
57d0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
57e0: 41 6c 6c 6f 63 61 74 65 28 78 29 20 53 51 4c 49  Allocate(x) SQLI
57f0: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62  TE_OK.# define b
5800: 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65  treePtrmapDelete
5810: 28 78 29 20 0a 23 20 64 65 66 69 6e 65 20 62 74  (x) .# define bt
5820: 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 78  reePtrmapBegin(x
5830: 2c 79 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  ,y)  SQLITE_OK.#
5840: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5850: 6d 61 70 45 6e 64 28 78 2c 79 2c 7a 29 20 0a 23  mapEnd(x,y,z) .#
5860: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5870: 6d 61 70 43 68 65 63 6b 28 79 2c 7a 29 20 0a 23  mapCheck(y,z) .#
5880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5890: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20  OMIT_CONCURRENT 
58a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
58b0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
58c0: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
58d0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
58e0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
58f0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
5900: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5910: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
5920: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5930: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5940: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
5950: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
5960: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5970: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
5980: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5990: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
59a0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
59b0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
59c0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
59d0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
59e0: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
59f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5a00: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5a10: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
5a20: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
5a30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5a40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
5a50: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
5a60: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
5a70: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
5a80: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
5a90: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
5aa0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
5ab0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
5ac0: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
5ad0: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
5ae0: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
5af0: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
5b00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
5b10: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
5b20: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
5b30: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
5b40: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
5b50: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
5b60: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
5b70: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
5b80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
5b90: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
5ba0: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
5bb0: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
5bc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5bd0: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
5be0: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
5bf0: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
5c00: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
5c10: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
5c20: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
5c30: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
5c40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5c50: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
5c60: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
5c70: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
5c80: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
5c90: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
5ca0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5cb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
5cc0: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
5cd0: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
5ce0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5cf0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5d00: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
5d10: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
5d20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
5d30: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
5d40: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
5d50: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
5d60: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
5d70: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5d80: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
5d90: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
5da0: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
5db0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
5dc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
5dd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
5de0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
5df0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
5e00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5e10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
5e20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
5e30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
5e40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
5e50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5e70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5e80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5e90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
5ea0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
5eb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
5ec0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
5ed0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
5ee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
5ef0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
5f00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
5f10: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
5f20: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
5f30: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
5f40: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
5f50: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
5f60: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
5f70: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
5f80: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
5f90: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
5fa0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
5fb0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
5fc0: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
5fd0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
5fe0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
5ff0: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
6000: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
6010: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
6020: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
6030: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
6040: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
6050: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
6060: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
6070: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
6080: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
6090: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
60a0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
60b0: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
60c0: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
60d0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
60e0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
60f0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
6100: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
6110: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
6120: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
6130: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
6140: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
6150: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6160: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
6170: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
6180: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
6190: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
61a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
61b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
61c0: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
61d0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
61e0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
61f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6200: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
6210: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
6220: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
6230: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
6240: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
6250: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
6260: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
6270: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
6280: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
6290: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
62a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
62b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
62c0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
62d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
62e0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
62f0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
6300: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
6310: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
6320: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
6330: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
6340: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
6350: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
6360: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
6370: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
6380: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
6390: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
63a0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
63b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
63c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
63d0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
63e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
63f0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
6400: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
6410: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
6420: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
6430: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6440: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
6450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6460: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
6470: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
6480: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
6490: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
64a0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
64b0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
64c0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
64d0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
64e0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
64f0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
6500: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
6510: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6520: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
6530: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
6540: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
6550: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
6560: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
6570: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
6580: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
6590: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
65a0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
65b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
65c0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
65d0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
65e0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
65f0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
6600: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6610: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
6620: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
6630: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
6640: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
6650: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
6660: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
6670: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
6680: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
6690: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
66a0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
66b0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
66c0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
66d0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
66e0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
66f0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
6700: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
6710: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
6720: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
6730: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
6740: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
6750: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
6760: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
6770: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
6780: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
6790: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
67a0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
67b0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
67c0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
67d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
67e0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
67f0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
6800: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
6810: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
6820: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
6830: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
6840: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
6850: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
6860: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
6870: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
6880: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
6890: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
68a0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
68b0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
68c0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
68d0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
68e0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
68f0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
6900: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
6910: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
6920: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
6930: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
6940: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
6950: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
6960: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
6970: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
6980: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
6990: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
69a0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
69b0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
69c0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
69d0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
69e0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
69f0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6a00: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
6a10: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
6a20: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
6a30: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
6a40: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
6a50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
6a60: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
6a70: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
6a80: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
6a90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6aa0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
6ab0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
6ac0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
6ad0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
6ae0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
6af0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
6b00: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
6b10: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
6b20: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
6b30: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
6b40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
6b50: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6b70: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
6b80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b90: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
6ba0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6bb0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
6bc0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
6bd0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
6be0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
6bf0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
6c00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
6c10: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
6c20: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
6c30: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
6c40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6c50: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
6c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
6c90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
6ca0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
6cc0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
6cd0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
6ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
6d00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
6d10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
6d20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
6d30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6d40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
6d50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
6d60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
6d70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
6d80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
6d90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
6da0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
6db0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
6dc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
6dd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
6de0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
6df0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
6e00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6e10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
6e20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
6e30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
6e40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
6e50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
6e60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
6e70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
6e80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
6e90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
6ea0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
6eb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
6ec0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
6ed0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6ee0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
6ef0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
6f00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
6f10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
6f20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
6f30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
6f40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
6f50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
6f60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
6f70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
6f80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
6f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
6fb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
6fc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
6fd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
6fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
6ff0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
7000: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
7010: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
7020: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
7030: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
7040: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
7050: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
7060: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
7070: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
7080: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
7090: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
70a0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
70b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
70c0: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
70d0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
70e0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
70f0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
7100: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
7110: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
7120: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7130: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
7140: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
7150: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
7160: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
7170: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
7180: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
7190: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
71a0: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
71b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
71c0: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
71d0: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
71e0: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
71f0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
7200: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
7210: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
7220: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
7230: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
7240: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
7250: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
7260: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
7270: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
7280: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
7290: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
72a0: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
72b0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
72c0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
72d0: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
72e0: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
72f0: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
7300: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
7310: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
7320: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
7330: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
7340: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7350: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7360: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
7370: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
7380: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
7390: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
73a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
73b0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
73c0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
73d0: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
73e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
73f0: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
7400: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
7410: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
7420: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
7440: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
7450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
7460: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
7470: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
7480: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
7490: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
74a0: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
74b0: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
74c0: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
74d0: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
74e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
74f0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
7500: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
7510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
7520: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
7530: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
7540: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
7550: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7560: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
7570: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
7580: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
75a0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
75b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
75c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
75d0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
75e0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
75f0: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
7600: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
7610: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
7620: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
7630: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
7640: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
7650: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
7660: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
7670: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
7680: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
7690: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
76a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
76b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
76c0: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
76d0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
76e0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
76f0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7700: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
7710: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
7720: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
7730: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
7740: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7750: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7760: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
7770: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
7780: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
7790: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
77a0: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
77b0: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
77c0: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
77d0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
77e0: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
77f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
7800: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
7810: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
7820: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
7830: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
7840: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
7850: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
7860: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
7870: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
7880: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7890: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
78a0: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
78b0: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
78c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
78d0: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
78e0: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
78f0: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
7900: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
7910: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
7920: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7930: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
7940: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
7950: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
7960: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
7970: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
7980: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
7990: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
79a0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
79b0: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
79c0: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
79d0: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
79e0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
79f0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
7a00: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
7a10: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
7a20: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
7a30: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
7a40: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
7a50: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
7a60: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
7a70: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
7a80: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
7a90: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
7aa0: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
7ab0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
7ac0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
7ad0: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
7ae0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
7af0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
7b00: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
7b10: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
7b20: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
7b30: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
7b40: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
7b50: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
7b60: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
7b70: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
7b80: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
7b90: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
7ba0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
7bb0: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
7bc0: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
7bd0: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
7be0: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
7bf0: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
7c00: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
7c10: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
7c20: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
7c30: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
7c40: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
7c50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
7c60: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
7c70: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
7c80: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
7c90: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
7ca0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
7cb0: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
7cc0: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
7cd0: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
7ce0: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
7cf0: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
7d00: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
7d10: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
7d20: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
7d30: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
7d40: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
7d50: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
7d60: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
7d70: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
7d80: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
7d90: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
7da0: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
7db0: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
7dc0: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
7dd0: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
7de0: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
7df0: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
7e00: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
7e10: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
7e20: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
7e30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7e40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
7e50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
7e60: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
7e70: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
7e80: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
7e90: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
7ea0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
7eb0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
7ec0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
7ed0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
7ee0: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
7ef0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
7f00: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
7f10: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
7f20: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
7f30: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
7f40: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
7f50: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
7f60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7f70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
7f80: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
7f90: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
7fa0: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
7fb0: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
7fc0: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
7fd0: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
7fe0: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
7ff0: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
8000: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
8010: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
8020: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
8030: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
8040: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
8050: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
8060: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
8070: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
8080: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
8090: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
80a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
80b0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
80c0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
80d0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
80f0: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
8100: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
8110: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
8120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
8130: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
8140: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
8150: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
8160: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
8170: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
8180: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
8190: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
81a0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
81b0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
81c0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
81d0: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
81e0: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
81f0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
8200: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
8210: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
8220: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
8230: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
8240: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
8250: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
8260: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
8270: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
8280: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8290: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
82a0: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
82b0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
82c0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
82d0: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
82e0: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
82f0: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
8300: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
8310: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8320: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
8330: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
8340: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
8350: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
8360: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
8370: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
8380: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
8390: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
83a0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
83b0: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
83c0: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
83d0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
83e0: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
83f0: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
8400: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
8410: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
8420: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
8430: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
8440: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
8450: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
8460: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
8470: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
8480: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
8490: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
84a0: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
84b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
84c0: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
84d0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
84e0: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
84f0: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
8500: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
8510: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
8520: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
8530: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
8540: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
8550: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
8560: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
8570: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
8580: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
8590: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
85a0: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
85b0: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
85c0: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
85d0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
85e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
85f0: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
8600: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
8610: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
8620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
8630: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
8640: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
8650: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
8660: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
8670: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
8680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
8690: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
86a0: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
86b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
86c0: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
86d0: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
86e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
86f0: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
8700: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
8710: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8720: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
8730: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
8740: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
8750: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
8760: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
8770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
8780: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
8790: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
87a0: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
87b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
87c0: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
87d0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
87e0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
87f0: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
8800: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
8810: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
8820: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
8830: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
8840: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
8850: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
8860: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
8870: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8880: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
8890: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
88a0: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
88b0: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
88c0: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
88d0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
88e0: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
88f0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
8900: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
8910: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
8920: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
8930: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
8940: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
8950: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
8960: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
8970: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
8980: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
8990: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
89a0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
89b0: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
89c0: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
89d0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
89e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
89f0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
8a00: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
8a10: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
8a20: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
8a30: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
8a40: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
8a50: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
8a60: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
8a70: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
8a80: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
8a90: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
8aa0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
8ab0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
8ac0: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
8ad0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
8ae0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
8af0: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
8b00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8b10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
8b20: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
8b30: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
8b40: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
8b50: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
8b60: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
8b70: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
8b80: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
8b90: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
8ba0: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
8bb0: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
8bc0: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
8bd0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
8be0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
8bf0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
8c00: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
8c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8c20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
8c30: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
8c40: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
8c50: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
8c60: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
8c70: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
8c80: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
8c90: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
8ca0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
8cb0: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
8cc0: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
8cd0: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
8ce0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
8cf0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
8d00: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
8d10: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
8d20: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
8d30: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
8d40: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
8d50: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
8d60: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
8d70: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
8d80: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
8d90: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
8da0: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
8db0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
8dc0: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
8dd0: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
8de0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
8df0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
8e00: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
8e10: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
8e20: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
8e30: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
8e40: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
8e50: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
8e60: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
8e70: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
8e80: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
8e90: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
8ea0: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
8eb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
8ec0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
8ed0: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
8ee0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
8ef0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
8f00: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
8f10: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
8f20: 72 20 74 6f 20 61 20 66 61 6b 65 20 42 74 43 75  r to a fake BtCu
8f30: 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 68 61 74  rsor object that
8f40: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73   will always ans
8f50: 77 65 72 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20  wer.** false to 
8f60: 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
8f70: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
8f80: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 20   routine above. 
8f90: 20 54 68 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72   The fake.** cur
8fa0: 73 6f 72 20 72 65 74 75 72 6e 65 64 20 6d 75 73  sor returned mus
8fb0: 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  t not be used wi
8fc0: 74 68 20 61 6e 79 20 6f 74 68 65 72 20 42 74 72  th any other Btr
8fd0: 65 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ee interface..*/
8fe0: 0a 42 74 43 75 72 73 6f 72 20 2a 73 71 6c 69 74  .BtCursor *sqlit
8ff0: 65 33 42 74 72 65 65 46 61 6b 65 56 61 6c 69 64  e3BtreeFakeValid
9000: 43 75 72 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20  Cursor(void){.  
9010: 73 74 61 74 69 63 20 75 38 20 66 61 6b 65 43 75  static u8 fakeCu
9020: 72 73 6f 72 20 3d 20 43 55 52 53 4f 52 5f 56 41  rsor = CURSOR_VA
9030: 4c 49 44 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  LID;.  assert( o
9040: 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
9050: 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a  , eState)==0 );.
9060: 20 20 72 65 74 75 72 6e 20 28 42 74 43 75 72 73    return (BtCurs
9070: 6f 72 2a 29 26 66 61 6b 65 43 75 72 73 6f 72 3b  or*)&fakeCursor;
9080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9090: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
90a0: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
90b0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
90c0: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
90d0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
90e0: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
90f0: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
9100: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
9110: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
9120: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
9130: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
9140: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
9150: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
9160: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
9170: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
9180: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
9190: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
91a0: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
91b0: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
91c0: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
91d0: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
91e0: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
91f0: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
9200: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
9210: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
9220: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
9230: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
9240: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
9250: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
9260: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
9270: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
9280: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
9290: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
92a0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
92b0: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
92c0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
92d0: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
92e0: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
92f0: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
9300: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
9310: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
9320: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
9330: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
9340: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
9350: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
9360: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
9370: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
9380: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
9390: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
93a0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
93b0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
93c0: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
93d0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
93e0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
93f0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
9400: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
9410: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
9420: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
9430: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
9440: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
9450: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
9460: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
9470: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
9480: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
9490: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
94a0: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
94b0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
94c0: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
94d0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
94e0: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
94f0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
9500: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
9510: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
9520: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
9530: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
9540: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
9550: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
9560: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
9570: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
9580: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
9590: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
95a0: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
95b0: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
95c0: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
95d0: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
95e0: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
95f0: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
9600: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
9610: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
9620: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
9630: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
9640: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
9650: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
9660: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
9670: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
9680: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
9690: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
96a0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
96b0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
96c0: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
96d0: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
96e0: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
96f0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
9700: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
9710: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
9720: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
9730: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
9740: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
9750: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
9760: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
9770: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
9780: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
9790: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
97a0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
97b0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
97c0: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
97d0: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
97e0: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
97f0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
9800: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
9810: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
9820: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
9830: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
9840: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
9850: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
9860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9870: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
9880: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
9890: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
98a0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
98b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
98c0: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
98d0: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
98e0: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
98f0: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
9900: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
9910: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
9920: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
9930: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
9940: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
9950: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
9960: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
9970: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
9980: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
9990: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
99a0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
99b0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
99c0: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
99d0: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
99e0: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
99f0: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
9a00: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
9a10: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
9a20: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
9a30: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
9a40: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
9a50: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
9a60: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
9a70: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
9a80: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
9a90: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
9aa0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
9ab0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
9ac0: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
9ad0: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
9ae0: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
9af0: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
9b00: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
9b10: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
9b20: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
9b30: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
9b40: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
9b50: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
9b60: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
9b70: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
9b80: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
9b90: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
9ba0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
9bb0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
9bc0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
9bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
9be0: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
9bf0: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
9c00: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
9c10: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
9c20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9c30: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
9c40: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
9c50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
9c60: 20 6e 75 6d 62 65 72 20 69 73 20 6e 65 76 65 72   number is never
9c70: 20 61 64 64 65 64 20 74 6f 20 61 20 70 6f 69 6e   added to a poin
9c80: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter-map page */.
9c90: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
9ca0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
9cb0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
9cc0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 23 69 66 6e  E(pBt)) );..#ifn
9cd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9ce0: 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28  CONCURRENT.  if(
9cf0: 20 70 42 74 2d 3e 70 4d 61 70 20 29 7b 0a 20 20   pBt->pMap ){.  
9d00: 20 20 2a 70 52 43 20 3d 20 62 74 72 65 65 50 74    *pRC = btreePt
9d10: 72 6d 61 70 53 74 6f 72 65 28 70 42 74 2c 20 6b  rmapStore(pBt, k
9d20: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
9d30: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
9d40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
9d50: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
9d60: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
9d70: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
9d80: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
9d90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
9da0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
9db0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
9dc0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
9dd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9de0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
9df0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
9e00: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
9e10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9e20: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
9e30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
9e40: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
9e50: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
9e60: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
9e70: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
9e80: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
9e90: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9ea0: 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74  goto ptrmap_exit
9eb0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9ec0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
9ed0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
9ee0: 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20   );.  pPtrmap = 
9ef0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
9f00: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
9f10: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
9f20: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
9f30: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
9f40: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
9f50: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
9f60: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
9f70: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
9f80: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
9f90: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
9fa0: 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c    *pRC= rc = sql
9fb0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
9fc0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
9fd0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9fe0: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
9ff0: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
a000: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
a010: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
a020: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
a030: 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65   }.  }..ptrmap_e
a040: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61  xit:.  sqlite3Pa
a050: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
a060: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
a070: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
a080: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
a090: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a0a0: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
a0b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
a0c0: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
a0d0: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
a0e0: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
a0f0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
a100: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
a110: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
a120: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
a130: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
a140: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
a150: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
a160: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
a170: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
a180: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
a190: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
a1a0: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
a1b0: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
a1c0: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
a1d0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
a1e0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
a1f0: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
a200: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
a210: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
a220: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
a230: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
a240: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
a250: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
a260: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
a270: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
a280: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
a290: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a2a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
a2b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
a2c0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
a2d0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
a2e0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a2f0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
a300: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
a310: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
a320: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
a330: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a340: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
a350: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
a360: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
a370: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
a380: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
a390: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
a3a0: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
a3b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
a3c0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
a3d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a3e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a3f0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
a400: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
a410: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
a420: 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21   assert( pEType!
a430: 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20  =0 );.  *pEType 
a440: 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  = pPtrmap[offset
a450: 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29  ];.  if( pPgno )
a460: 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79   *pPgno = get4by
a470: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
a480: 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  et+1]);..  sqlit
a490: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
a4a0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45  Page);.  if( *pE
a4b0: 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70  Type<1 || *pETyp
a4c0: 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e>5 ) return SQL
a4d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
a4e0: 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65 74  (iPtrmap);.  ret
a4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a500: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
a510: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
a520: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
a530: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
a540: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
a550: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
a560: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
a570: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
a580: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
a590: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
a5a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
a5b0: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
a5c0: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
a5d0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
a5e0: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
a5f0: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
a600: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
a610: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
a620: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
a630: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
a640: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
a650: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
a660: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
a670: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
a680: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
a690: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
a6a0: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
a6b0: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
a6c0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
a6d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a6e0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
a6f0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
a700: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
a710: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
a720: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
a730: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
a740: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
a750: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
a760: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
a770: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
a780: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
a790: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
a7a0: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
a7b0: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
a7c0: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
a7d0: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
a7e0: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
a7f0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
a800: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
a810: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
a820: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
a830: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
a840: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
a850: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
a860: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
a870: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
a880: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
a890: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
a8a0: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
a8b0: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
a8c0: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
a8d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
a8e0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
a8f0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
a900: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a910: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
a920: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a930: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a940: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a950: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
a960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a970: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
a980: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
a990: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
a9a0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
a9b0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
a9c0: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
a9d0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
a9e0: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
a9f0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
aa00: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
aa10: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
aa20: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
aa30: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
aa40: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
aa50: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
aa60: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
aa70: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
aa80: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
aa90: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
aaa0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
aab0: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
aac0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
aad0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
aae0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
aaf0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
ab00: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
ab10: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
ab20: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
ab30: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
ab40: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
ab50: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
ab60: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
ab70: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
ab80: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
ab90: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
aba0: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
abb0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
abc0: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
abd0: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
abe0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
abf0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
ac00: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
ac10: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
ac20: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
ac30: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
ac40: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
ac50: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
ac60: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
ac70: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
ac80: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
ac90: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
aca0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
acb0: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
acc0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
acd0: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
ace0: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
acf0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
ad00: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
ad10: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
ad20: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
ad30: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
ad40: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
ad50: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
ad60: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
ad70: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
ad80: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
ad90: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
ada0: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
adb0: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
adc0: 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d   - pCell) + 4;.}
add0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
ade0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
adf0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
ae00: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
ae10: 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a  e.xParseCell().*
ae20: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
ae30: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
ae40: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
ae50: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
ae60: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
ae70: 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  *.** btreeParseC
ae80: 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20  ellPtr()        
ae90: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
aea0: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62   leaf nodes.** b
aeb0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50  treeParseCellNoP
aec0: 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74  ayload()  =>   t
aed0: 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72  able btree inter
aee0: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  nal nodes.** btr
aef0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
af00: 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64  dex()   =>   ind
af10: 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a  ex btree nodes.*
af20: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c  *.** There is al
af30: 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e  so a wrapper fun
af40: 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65  ction btreeParse
af50: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
af60: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d  s for.** all Mem
af70: 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74  Page types and t
af80: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
af90: 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78  he cell by index
afa0: 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20   rather than.** 
afb0: 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  by pointer..*/.s
afc0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
afd0: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
afe0: 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65  yload(.  MemPage
aff0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
b000: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
b010: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
b020: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
b030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
b040: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
b050: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
b060: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
b070: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
b080: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
b090: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  .){.  assert( sq
b0a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b0b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b0c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b0d0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
b0e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b0f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
b100: 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==4 );.#ifndef S
b110: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
b120: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b130: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
b140: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
b150: 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43   + getVarint(&pC
b160: 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70  ell[4], (u64*)&p
b170: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70  Info->nKey);.  p
b180: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
b190: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f   0;.  pInfo->nLo
b1a0: 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  cal = 0;.  pInfo
b1b0: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
b1c0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
b1d0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
b1e0: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
b1f0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
b200: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
b210: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
b220: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b240: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
b250: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
b260: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
b270: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
b280: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
b290: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
b2a0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
b2b0: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
b2c0: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
b2d0: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
b2e0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
b2f0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b300: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
b310: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b330: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
b340: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
b350: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b360: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b370: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b380: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
b390: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
b3a0: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
b3b0: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
b3c0: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
b3d0: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
b3e0: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
b3f0: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
b400: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
b410: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
b420: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
b430: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
b440: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
b450: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
b460: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
b470: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
b480: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
b490: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
b4a0: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
b4b0: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
b4c0: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
b4d0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
b4e0: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
b4f0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
b500: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
b510: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
b520: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
b530: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
b540: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
b550: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
b560: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
b570: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
b580: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
b590: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
b5a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
b5b0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
b5c0: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
b5d0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
b5e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
b5f0: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
b600: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
b610: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
b620: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
b630: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
b640: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
b650: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
b660: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
b670: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
b680: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
b690: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
b6a0: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
b6b0: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
b6c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
b6d0: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
b6e0: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
b6f0: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
b700: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
b710: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b720: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
b730: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
b740: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
b750: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
b760: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
b770: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
b780: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
b790: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
b7a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
b7b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
b7c0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
b7d0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
b7e0: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
b7f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
b800: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
b810: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
b820: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
b830: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
b840: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
b850: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
b860: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
b870: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
b880: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
b890: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
b8a0: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
b8b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
b8c0: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
b8d0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
b8e0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
b8f0: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
b900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
b910: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
b920: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
b930: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
b940: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
b950: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
b960: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
b970: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
b980: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
b990: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
b9a0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
b9b0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
b9c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
b9d0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
b9e0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
b9f0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
ba00: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
ba10: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
ba20: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
ba30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
ba40: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
ba50: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
ba60: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
ba70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ba80: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
ba90: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
baa0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
bab0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
bac0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
bad0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
bae0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
baf0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
bb00: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
bb10: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
bb20: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
bb30: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
bb40: 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
bb50: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
bb60: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
bb70: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
bb80: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
bb90: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
bba0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
bbb0: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
bbc0: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
bbd0: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
bbe0: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
bbf0: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
bc00: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
bc10: 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f  pIter++;.  pInfo
bc20: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
bc30: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  d;.  pInfo->nPay
bc40: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
bc50: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
bc60: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
bc70: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
bc80: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
bc90: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
bca0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
bcb0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
bcc0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
bcd0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
bce0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
bcf0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
bd00: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
bd10: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
bd20: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
bd30: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
bd40: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
bd50: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
bd60: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
bd70: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
bd80: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
bd90: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
bda0: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
bdb0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
bdc0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
bdd0: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
bde0: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
bdf0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
be00: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
be10: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
be20: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
be30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
be40: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
be50: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
be60: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
be70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
be80: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
be90: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
bea0: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
beb0: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
bec0: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
bed0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
bee0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
bef0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
bf00: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
bf10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
bf20: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
bf30: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
bf40: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
bf50: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
bf60: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
bf70: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
bf80: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
bf90: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
bfa0: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
bfb0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
bfc0: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
bfd0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
bfe0: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
bff0: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
c000: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
c010: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
c020: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
c030: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
c040: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
c050: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
c060: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
c070: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
c080: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
c090: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
c0a0: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
c0b0: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
c0c0: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
c0d0: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
c0e0: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
c0f0: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
c100: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
c110: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
c120: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
c130: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
c140: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
c150: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
c160: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
c170: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
c180: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
c190: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
c1c0: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
c1d0: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
c1e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
c210: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
c220: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c230: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
c240: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
c250: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
c260: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
c270: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
c280: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
c290: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
c2a0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
c2b0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
c2c0: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
c2d0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
c2e0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
c2f0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
c300: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
c310: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
c320: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
c330: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
c340: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
c350: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
c360: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
c370: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
c380: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
c390: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
c3a0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
c3b0: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
c3c0: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
c3d0: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
c3e0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
c3f0: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
c400: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
c410: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
c420: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
c430: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
c440: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
c450: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
c460: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
c470: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
c480: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
c490: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
c4a0: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
c4b0: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
c4c0: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
c4d0: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
c4e0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
c4f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
c500: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
c510: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
c520: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
c530: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
c540: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
c550: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
c560: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
c570: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
c580: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c590: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
c5a0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
c5b0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
c5c0: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
c5d0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
c5e0: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
c5f0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
c600: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
c610: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
c620: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
c630: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
c640: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
c650: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
c660: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
c670: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
c680: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
c690: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c6a0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
c6b0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
c6c0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
c6d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
c6e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
c6f0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
c700: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
c710: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
c720: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
c730: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
c740: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
c750: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
c760: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
c770: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
c780: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
c790: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
c7a0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
c7b0: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
c7c0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
c7d0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
c7e0: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
c7f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
c800: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
c810: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
c830: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
c840: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
c850: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
c860: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
c870: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
c880: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
c890: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
c8a0: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
c8b0: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
c8c0: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
c8d0: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
c8e0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
c8f0: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
c900: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
c910: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
c920: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
c930: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
c940: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
c950: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
c960: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
c970: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
c980: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
c990: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
c9a0: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
c9b0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
c9c0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
c9d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
c9e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
c9f0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
ca00: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
ca10: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
ca20: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
ca30: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
ca40: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
ca50: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
ca60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
ca70: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
ca80: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
ca90: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
caa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
cab0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
cac0: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
cad0: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
cae0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
caf0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
cb00: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
cb10: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
cb20: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
cb30: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
cb40: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
cb50: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
cb60: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
cb70: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
cb80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cb90: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
cba0: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
cbb0: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
cbc0: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
cbd0: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
cbe0: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
cbf0: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
cc00: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
cc10: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
cc20: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
cc30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
cc40: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
cc50: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
cc60: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
cc70: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
cc80: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
cc90: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
cca0: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
ccb0: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
ccc0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
ccd0: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
cce0: 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
ccf0: 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
cd00: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
cd10: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
cd20: 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29  l[info.nSize-4])
cd30: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
cd40: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
cd50: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
cd60: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
cd70: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
cd80: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
cd90: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
cda0: 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75 74  given. This rout
cdb0: 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73 20  ine reorganizes 
cdc0: 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  cells within the
cdd0: 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61 74  .** page so that
cde0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   there are no fr
cdf0: 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  ee-blocks on the
ce00: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74   free-block list
ce10: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
ce20: 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74 68  r nMaxFrag is th
ce30: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
ce40: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 73   of fragmented s
ce50: 70 61 63 65 20 74 68 61 74 20 6d 61 79 20 62 65  pace that may be
ce60: 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74  .** present in t
ce70: 68 65 20 70 61 67 65 20 61 66 74 65 72 20 74 68  he page after th
ce80: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
ce90: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e  ns..**.** EVIDEN
cea0: 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36  CE-OF: R-44582-6
ceb0: 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20  0138 SQLite may 
cec0: 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d  from time to tim
ced0: 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a  e reorganize a.*
cee0: 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f  * b-tree page so
cef0: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
cf00: 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72  no freeblocks or
cf10: 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c   fragment bytes,
cf20: 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62   all.** unused b
cf30: 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e  ytes are contain
cf40: 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f  ed in the unallo
cf50: 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69  cated space regi
cf60: 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63  on, and all.** c
cf70: 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20  ells are packed 
cf80: 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65  tightly at the e
cf90: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
cfa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
cfb0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
cfc0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
cfd0: 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69 6e   nMaxFrag){.  in
cfe0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
cff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
d000: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
d010: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
d020: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
d030: 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ess of the i-th 
d040: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
d050: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d060: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
d070: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
d080: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
d0b0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
d0c0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
d0d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d0e0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
d0f0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
d100: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
d110: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
d120: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
d130: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
d140: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
d150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d160: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
d170: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d180: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
d1b0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
d1c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d1d0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
d1e0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
d1f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d200: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
d210: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
d220: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
d230: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
d240: 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  *src;        /* 
d250: 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e  Source of conten
d260: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
d270: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
d280: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
d290: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
d2a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
d2b0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
d2c0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
d2d0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
d2e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d2f0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
d300: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
d310: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
d320: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
d330: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d340: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d350: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
d360: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
d370: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
d380: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
d390: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d3a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d3b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d3c0: 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72    temp = 0;.  sr
d3d0: 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65  c = data = pPage
d3e0: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
d3f0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d400: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
d410: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
d420: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
d430: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
d440: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
d450: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d460: 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46  +3]) );.  iCellF
d470: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
d480: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75  t + 2*nCell;.  u
d490: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
d4a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d4b0: 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  ze;..  /* This b
d4c0: 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61 67  lock handles pag
d4d0: 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 66  es with two or f
d4e0: 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b 73  ewer free blocks
d4f0: 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20 20   and nMaxFrag.  
d500: 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61 67  ** or fewer frag
d510: 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49 6e  mented bytes. In
d520: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
d530: 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65 20   faster to move 
d540: 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72  the.  ** two (or
d550: 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20   one) blocks of 
d560: 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d  cells using memm
d570: 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20 74 68  ove() and add th
d580: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
d590: 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63 68 20  offsets to each 
d5a0: 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
d5b0: 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
d5c0: 79 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20  y than it is to 
d5d0: 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63  .  ** reconstruc
d5e0: 74 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  t the entire pag
d5f0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e  e.  */.  if( (in
d600: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e  t)data[hdr+7]<=n
d610: 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20 69  MaxFrag ){.    i
d620: 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74 32 62  nt iFree = get2b
d630: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
d640: 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  );.    if( iFree
d650: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46   ){.      int iF
d660: 72 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28  ree2 = get2byte(
d670: 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 0a  &data[iFree]);..
d680: 20 20 20 20 20 20 2f 2a 20 70 61 67 65 46 69 6e        /* pageFin
d690: 64 53 6c 6f 74 28 29 20 68 61 73 20 61 6c 72 65  dSlot() has alre
d6a0: 61 64 79 20 76 65 72 69 66 69 65 64 20 74 68 61  ady verified tha
d6b0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 72  t free blocks ar
d6c0: 65 20 73 6f 72 74 65 64 0a 20 20 20 20 20 20 2a  e sorted.      *
d6d0: 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 6f 66  * in order of of
d6e0: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
d6f0: 70 61 67 65 2c 20 61 6e 64 20 74 68 61 74 20 6e  page, and that n
d700: 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 0a  o block extends.
d710: 20 20 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68        ** past th
d720: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d730: 65 2e 20 50 72 6f 76 69 64 65 64 20 74 68 65 20  e. Provided the 
d740: 74 77 6f 20 66 72 65 65 20 73 6c 6f 74 73 20 64  two free slots d
d750: 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20  o not .      ** 
d760: 6f 76 65 72 6c 61 70 2c 20 74 68 69 73 20 67 75  overlap, this gu
d770: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
d780: 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61 6c 6c  e memmove() call
d790: 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  s below will not
d7a0: 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  .      ** overwr
d7b0: 69 74 65 20 74 68 65 20 75 73 61 62 6c 65 53 69  ite the usableSi
d7c0: 7a 65 20 62 79 74 65 20 62 75 66 66 65 72 2c 20  ze byte buffer, 
d7d0: 65 76 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  even if the data
d7e0: 62 61 73 65 20 70 61 67 65 0a 20 20 20 20 20 20  base page.      
d7f0: 2a 2a 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  ** is corrupt.  
d800: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
d810: 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46   iFree2==0 || iF
d820: 72 65 65 32 3e 69 46 72 65 65 20 29 3b 0a 20 20  ree2>iFree );.  
d830: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
d840: 65 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  e+get2byte(&data
d850: 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20 75 73  [iFree+2]) <= us
d860: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
d870: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32    assert( iFree2
d880: 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b 67 65  ==0 || iFree2+ge
d890: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
d8a0: 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c  ee2+2]) <= usabl
d8b0: 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 20 20  eSize );..      
d8c0: 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20 7c 7c  if( 0==iFree2 ||
d8d0: 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d 3d 3d   (data[iFree2]==
d8e0: 30 20 26 26 20 64 61 74 61 5b 69 46 72 65 65 32  0 && data[iFree2
d8f0: 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  +1]==0) ){.     
d900: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 64     u8 *pEnd = &d
d910: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
d920: 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20   nCell*2];.     
d930: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a 20 20     u8 *pAddr;.  
d940: 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20 3d 20        int sz2 = 
d950: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  0;.        int s
d960: 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  z = get2byte(&da
d970: 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a 20 20  ta[iFree+2]);.  
d980: 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20 3d 20        int top = 
d990: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d9a0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20  dr+5]);.        
d9b0: 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65 20 29  if( top>=iFree )
d9c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
d9d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d9e0: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
d9f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
da00: 20 69 66 28 20 69 46 72 65 65 32 20 29 7b 0a 20   if( iFree2 ){. 
da10: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
da20: 20 69 46 72 65 65 2b 73 7a 3c 3d 69 46 72 65 65   iFree+sz<=iFree
da30: 32 20 29 3b 20 2f 2a 20 56 65 72 69 66 69 65 64  2 ); /* Verified
da40: 20 62 79 20 70 61 67 65 46 69 6e 64 53 6c 6f 74   by pageFindSlot
da50: 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  () */.          
da60: 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  sz2 = get2byte(&
da70: 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b  data[iFree2+2]);
da80: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
da90: 74 28 20 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b  t( iFree+sz+sz2+
daa0: 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a  iFree2-(iFree+sz
dab0: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
dac0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
dad0: 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65  move(&data[iFree
dae0: 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b  +sz+sz2], &data[
daf0: 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65  iFree+sz], iFree
db00: 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20  2-(iFree+sz));. 
db10: 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73           sz += s
db20: 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z2;.        }.  
db30: 20 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70        cbrk = top
db40: 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73  +sz;.        ass
db50: 65 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65  ert( cbrk+(iFree
db60: 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53  -top) <= usableS
db70: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ize );.        m
db80: 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72  emmove(&data[cbr
db90: 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20  k], &data[top], 
dba0: 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20  iFree-top);.    
dbb0: 20 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64      for(pAddr=&d
dbc0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
dbd0: 20 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64   pAddr<pEnd; pAd
dbe0: 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20  dr+=2){.        
dbf0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
dc00: 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  pAddr);.        
dc10: 20 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29    if( pc<iFree )
dc20: 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72  { put2byte(pAddr
dc30: 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20  , pc+sz); }.    
dc40: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70        else if( p
dc50: 63 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32  c<iFree2 ){ put2
dc60: 62 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73  byte(pAddr, pc+s
dc70: 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  z2); }.        }
dc80: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
dc90: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20  fragment_out;.  
dca0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dcb0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
dcc0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Size;.  iCellLas
dcd0: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
dce0: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
dcf0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
dd00: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
dd10: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
dd20: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
dd30: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
dd40: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
dd50: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
dd60: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
dd70: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
dd80: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
dd90: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
dda0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f  ellLast );.    /
ddb0: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
ddc0: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
ddd0: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
dde0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
ddf0: 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d  .    ** if PRAGM
de00: 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63  A cell_size_chec
de10: 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  k=ON..    */.   
de20: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
de30: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
de40: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
de50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
de60: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
de70: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
de80: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
de90: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
dea0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70   );.    size = p
deb0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
dec0: 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29  pPage, &src[pc])
ded0: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
dee0: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
def0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
df00: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
df10: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
df20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
df30: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
df40: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
df50: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
df60: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
df70: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
df80: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
df90: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
dfa0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
dfb0: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
dfc0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74  eSize );.    put
dfd0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
dfe0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70  k);.    if( temp
dff0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
e000: 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62   x;.      if( cb
e010: 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75  rk==pc ) continu
e020: 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20  e;.      temp = 
e030: 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
e040: 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74  Space(pPage->pBt
e050: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
e060: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
e070: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
e080: 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b     memcpy(&temp[
e090: 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63  x], &data[x], (c
e0a0: 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a  brk+size) - x);.
e0b0: 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70        src = temp
e0c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
e0d0: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
e0e0: 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  &src[pc], size);
e0f0: 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b  .  }.  data[hdr+
e100: 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67  7] = 0;.. defrag
e110: 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ment_out:.  if( 
e120: 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b  data[hdr+7]+cbrk
e130: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
e140: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
e150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e160: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
e170: 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
e180: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
e190: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
e1a0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
e1b0: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
e1c0: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
e1d0: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65  hdr+2] = 0;.  me
e1e0: 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c  mset(&data[iCell
e1f0: 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d  First], 0, cbrk-
e200: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61  iCellFirst);.  a
e210: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e220: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e230: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e240: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e250: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e260: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
e270: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
e280: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
e290: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
e2a0: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
e2b0: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
e2c0: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
e2d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
e2e0: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
e2f0: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
e300: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
e310: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
e320: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
e330: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
e340: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
e350: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e360: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
e370: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
e380: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
e390: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
e3a0: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
e3b0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
e3c0: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
e3d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
e3e0: 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65  .** Slots on the
e3f0: 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20   free list that 
e400: 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e  are between 1 an
e410: 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72  d 3 bytes larger
e420: 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77   than nByte.** w
e430: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69  ill be ignored i
e440: 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74  f adding the ext
e450: 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20  ra space to the 
e460: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
e470: 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68  unt.** causes th
e480: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
e490: 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20  count to exceed 
e4a0: 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  60..*/.static u8
e4b0: 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d   *pageFindSlot(M
e4c0: 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  emPage *pPg, int
e4d0: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63   nByte, int *pRc
e4e0: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
e4f0: 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
e500: 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  set;.  u8 * cons
e510: 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
e520: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64  Data;.  int iAdd
e530: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
e540: 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
e550: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b  (&aData[iAddr]);
e560: 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20  .  int x;.  int 
e570: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
e580: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e590: 65 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  e;.  int size;  
e5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
e5b0: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
e5c0: 6f 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ot */..  assert(
e5d0: 20 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65   pc>0 );.  while
e5e0: 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a 65  ( pc<=usableSize
e5f0: 2d 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  -4 ){.    /* EVI
e600: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31  DENCE-OF: R-2271
e610: 30 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72  0-53328 The thir
e620: 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74  d and fourth byt
e630: 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a  es of each.    *
e640: 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d  * freeblock form
e650: 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e   a big-endian in
e660: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
e670: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
e680: 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  reeblock.    ** 
e690: 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64  in bytes, includ
e6a0: 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68  ing the 4-byte h
e6b0: 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69  eader. */.    si
e6c0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ze = get2byte(&a
e6d0: 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  Data[pc+2]);.   
e6e0: 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d   if( (x = size -
e6f0: 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20   nByte)>=0 ){.  
e700: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
e710: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
e720: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
e730: 20 20 20 20 69 66 28 20 73 69 7a 65 2b 70 63 20      if( size+pc 
e740: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
e750: 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53          *pRc = S
e760: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e770: 47 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  GE(pPg);.       
e780: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
e790: 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29   }else if( x<4 )
e7a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
e7b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39  DENCE-OF: R-1149
e7c0: 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c  8-58022 In a wel
e7d0: 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
e7e0: 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a  page, the total.
e7f0: 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
e800: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72  r of bytes in fr
e810: 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20  agments may not 
e820: 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20  exceed 60. */.  
e830: 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b        if( aData[
e840: 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75  hdr+7]>57 ) retu
e850: 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f  rn 0;..        /
e860: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
e870: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
e880: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
e890: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
e8a0: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
e8b0: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
e8c0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
e8d0: 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
e8e0: 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b  [iAddr], &aData[
e8f0: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
e900: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d   aData[hdr+7] +=
e910: 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65   (u8)x;.      }e
e920: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
e930: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
e940: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
e950: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
e960: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
e970: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
e980: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
e990: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
e9a0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
e9b0: 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
e9c0: 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  [pc+2], x);.    
e9d0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
e9e0: 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b   &aData[pc + x];
e9f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72  .    }.    iAddr
ea00: 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20   = pc;.    pc = 
ea10: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
ea20: 70 63 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 63  pc]);.    if( pc
ea30: 3c 69 41 64 64 72 2b 73 69 7a 65 20 29 20 62 72  <iAddr+size ) br
ea40: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
ea50: 63 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  c ){.    *pRc = 
ea60: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
ea70: 41 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  AGE(pPg);.  }.. 
ea80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ea90: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
eaa0: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
eab0: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
eac0: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
ead0: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
eae0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
eaf0: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
eb00: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
eb10: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
eb20: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
eb30: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
eb40: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
eb50: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
eb60: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
eb70: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
eb80: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
eb90: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
eba0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
ebb0: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
ebc0: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
ebd0: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
ebe0: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
ebf0: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
ec00: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
ec10: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
ec20: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
ec30: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
ec40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
ec50: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
ec60: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
ec70: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
ec80: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
ec90: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
eca0: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
ecb0: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
ecc0: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
ecd0: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
ece0: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
ecf0: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
ed00: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
ed10: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
ed20: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
ed30: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
ed40: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
ed50: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
ed60: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
ed70: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
ed80: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
ed90: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
eda0: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
edb0: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
edc0: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
edd0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
ede0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
edf0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
ee20: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
ee30: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ee40: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ee50: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
ee60: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
ee70: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
ee80: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
ee90: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
eea0: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
eeb0: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
eec0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
eed0: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
eee0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
eef0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ef00: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
ef10: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
ef20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ef30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ef40: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ef50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
ef60: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
ef70: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
ef80: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
ef90: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
efa0: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
efb0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
efc0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
efd0: 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29  t( nByte < (int)
efe0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
eff0: 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20  bleSize-8) );.. 
f000: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f010: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
f020: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
f030: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
f040: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
f050: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
f060: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
f070: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
f080: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f090: 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66  R-29356-02391 If
f0a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
f0b0: 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20  es a 65536-byte 
f0c0: 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61  page size.  ** a
f0d0: 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20  nd the reserved 
f0e0: 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74  space is zero (t
f0f0: 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66  he usual value f
f100: 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63  or reserved spac
f110: 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e).  ** then the
f120: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
f130: 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79  fset of an empty
f140: 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62   page wants to b
f150: 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f  e 65536..  ** Ho
f160: 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65  wever, that inte
f170: 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ger is too large
f180: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e   to be stored in
f190: 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   a 2-byte unsign
f1a0: 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  ed.  ** integer,
f1b0: 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30   so a value of 0
f1c0: 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20   is used in its 
f1d0: 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20  place. */.  top 
f1e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f1f0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
f200: 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50  rt( top<=(int)pP
f210: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
f220: 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65  Size ); /* Preve
f230: 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74  nt by getAndInit
f240: 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20  Page() */.  if( 
f250: 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69  gap>top ){.    i
f260: 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61  f( top==0 && pPa
f270: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
f280: 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20  ize==65536 ){.  
f290: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
f2a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f2c0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
f2d0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ge);.    }.  }..
f2e0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
f2f0: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
f300: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
f310: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
f320: 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ell pointer.  **
f330: 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66   array entry off
f340: 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20  set, and if the 
f350: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
f360: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
f370: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
f380: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
f390: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
f3a0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
f3b0: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
f3c0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
f3d0: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
f3e0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
f3f0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
f400: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
f410: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
f420: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
f430: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
f440: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
f450: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
f460: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
f470: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
f480: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
f490: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
f4a0: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
f4b0: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
f4c0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
f4d0: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
f4e0: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
f4f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
f500: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
f510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f520: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f530: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
f540: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
f550: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
f560: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
f570: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
f580: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
f590: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
f5a0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
f5b0: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
f5c0: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
f5d0: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
f5e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f5f0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
f600: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20  PT_DB );.    rc 
f610: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
f620: 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70  (pPage, MIN(4, p
f630: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32  Page->nFree - (2
f640: 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69  +nByte)));.    i
f650: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
f660: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
f670: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
f680: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
f690: 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42  assert( gap+2+nB
f6a0: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
f6b0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
f6c0: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
f6d0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
f6e0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
f6f0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
f700: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
f710: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
f720: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
f730: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
f740: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
f750: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
f760: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
f770: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
f780: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
f790: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
f7a0: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
f7b0: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
f7c0: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
f7d0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
f7e0: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
f7f0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
f800: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
f810: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
f820: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
f830: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
f840: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
f850: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
f860: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
f870: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
f880: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f890: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
f8a0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
f8b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
f8c0: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
f8d0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
f8e0: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
f8f0: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
f900: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
f910: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
f920: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
f930: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
f940: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
f950: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
f960: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
f970: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
f980: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
f990: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
f9a0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
f9b0: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
f9c0: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
f9d0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
f9e0: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
f9f0: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
fa00: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
fa10: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
fa20: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
fa30: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
fa40: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
fa50: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
fa60: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
fa70: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
fa80: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
fa90: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
faa0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
fab0: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
fac0: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
fad0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
fae0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
faf0: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
fb00: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
fb10: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
fb40: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
fb50: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
fb60: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
fb70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fb80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
fb90: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
fba0: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
fbb0: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
fbe0: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
fbf0: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
fc00: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
fc30: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
fc40: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
fc50: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
fc60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
fc70: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
fc80: 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b 20  ize */.  u16 x; 
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fcb0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
fcc0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
fcd0: 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53  .  u32 iEnd = iS
fce0: 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20  tart + iSize;   
fcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
fd00: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
fd10: 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f  iStart buffer */
fd20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
fd30: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
fd40: 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65  aData;   /* Page
fd50: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61   content */..  a
fd60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fd70: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
fd80: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
fd90: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
fda0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
fdb0: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
fdc0: 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61  B || iStart>=pPa
fdd0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
fde0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
fdf0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
fe00: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
fe10: 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42  End <= pPage->pB
fe20: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
fe30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fe40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
fe50: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
fe60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
fe70: 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d  ize>=4 );   /* M
fe80: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
fe90: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
fea0: 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67 65  t( iStart<=pPage
feb0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
fec0: 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  e-4 );..  /* The
fed0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
fee0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
fef0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
ff00: 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20   Find the .  ** 
ff10: 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  spot on the list
ff20: 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68   where iStart sh
ff30: 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
ff40: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
ff50: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ff60: 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20  .  iPtr = hdr + 
ff70: 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50  1;.  if( data[iP
ff80: 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61  tr+1]==0 && data
ff90: 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iPtr]==0 ){.   
ffa0: 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20   iFreeBlk = 0;  
ffb0: 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
ffc0: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
ffd0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
ffe0: 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  pty */.  }else{.
fff0: 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65      while( (iFre
10000 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
10010 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53  &data[iPtr]))<iS
10020 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
10030 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
10040 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  4 ){.        if(
10050 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62   iFreeBlk==0 ) b
10060 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65  reak;.        re
10070 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10080 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
100a0 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a  Ptr = iFreeBlk;.
100b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46      }.    if( iF
100c0 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42  reeBlk>pPage->pB
100d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
100e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
100f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10100 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10110 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  }.    assert( iF
10120 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
10130 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
10140 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
10150 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
10160 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
10170 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
10180 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
10190 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
101a0 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
101b0 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
101c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72  a pointer to iFr
101d0 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20  eeBlk.    **.   
101e0 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
101f0 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f   if iFreeBlk sho
10200 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64  uld be coalesced
10210 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
10220 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a   iStart..    */.
10230 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
10240 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65   && iEnd+3>=iFre
10250 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46  eBlk ){.      nF
10260 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d  rag = iFreeBlk -
10270 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28   iEnd;.      if(
10280 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
10290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
102a0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
102b0 65 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  e);.      iEnd =
102c0 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
102d0 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
102e0 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
102f0 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
10300 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
10310 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10320 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10330 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 69       }.      iSi
10350 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61  ze = iEnd - iSta
10360 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42  rt;.      iFreeB
10370 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
10380 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a  ata[iFreeBlk]);.
10390 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
103a0 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68  If iPtr is anoth
103b0 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68  er freeblock (th
103c0 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69  at is, if iPtr i
103d0 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69  s not the freeli
103e0 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  st.    ** pointe
103f0 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  r in the page he
10400 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b  ader) then check
10410 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72   to see if iStar
10420 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  t should be.    
10430 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  ** coalesced ont
10440 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74  o the end of iPt
10450 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
10460 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a  ( iPtr>hdr+1 ){.
10470 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e        int iPtrEn
10480 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62  d = iPtr + get2b
10490 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32  yte(&data[iPtr+2
104a0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
104b0 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20  trEnd+3>=iStart 
104c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
104d0 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20  PtrEnd>iStart ) 
104e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
104f0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10500 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  );.        nFrag
10510 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
10520 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
10530 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
10540 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
10550 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
10560 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10570 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
10580 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
10590 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
105a0 50 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61 5b  Page);.    data[
105b0 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b  hdr+7] -= nFrag;
105c0 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32 62  .  }.  x = get2b
105d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
105e0 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 3c  );.  if( iStart<
105f0 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =x ){.    /* The
10600 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
10610 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
10620 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ng of the cell c
10630 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20  ontent area,.   
10640 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65   ** so just exte
10650 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
10660 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20  ent area rather 
10670 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74  than create anot
10680 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c  her.    ** freel
10690 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ist entry */.   
106a0 20 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c 7c   if( iStart<x ||
106b0 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
106c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
106d0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
106e0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
106f0 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72  data[hdr+1], iFr
10700 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
10710 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
10720 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  ], iEnd);.  }els
10730 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  e{.    /* Insert
10740 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   the new freeblo
10750 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65  ck into the free
10760 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32  list */.    put2
10770 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
10780 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  , iStart);.  }. 
10790 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
107a0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
107b0 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20  FAST_SECURE ){. 
107c0 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
107d0 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
107e0 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
107f0 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
10800 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74  elete.    ** opt
10810 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
10820 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  /.    memset(&da
10830 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
10840 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75 74  Size);.  }.  put
10850 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
10860 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
10870 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10880 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a  [iStart+2], iSiz
10890 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
108a0 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b  ee += iOrigSize;
108b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
108c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
108d0 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
108e0 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
108f0 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
10900 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
10910 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
10920 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
10930 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
10940 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
10950 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
10960 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
10970 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
10980 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
10990 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
109a0 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
109b0 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
109c0 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
109d0 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
109e0 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
109f0 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
10a00 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
10a10 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
10a20 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
10a30 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
10a40 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
10a50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
10a60 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
10a70 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
10a80 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
10a90 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
10aa0 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
10ab0 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
10ac0 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
10ad0 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
10ae0 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
10af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10b00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10b10 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
10b20 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
10b30 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
10b40 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
10b50 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
10b60 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
10b70 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
10b80 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
10b90 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
10ba0 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65  e->leaf;.  pPage
10bb0 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
10bc0 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74  llSizePtr;.  pBt
10bd0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
10be0 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
10bf0 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
10c00 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
10c10 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10c20 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20  : R-07291-35328 
10c30 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78  A value of 5 (0x
10c40 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  05) means the pa
10c50 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  ge is an.    ** 
10c60 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62  interior table b
10c70 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
10c80 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
10c90 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
10ca0 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f  KEY)==5 );.    /
10cb0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10cc0 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76  -26900-09176 A v
10cd0 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64  alue of 13 (0x0d
10ce0 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
10cf0 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
10d00 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  f table b-tree p
10d10 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
10d20 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
10d30 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  A|PTF_INTKEY|PTF
10d40 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20  _LEAF)==13 );.  
10d50 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
10d60 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
10d70 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
10d80 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
10d90 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  eaf = 1;.      p
10da0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
10db0 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
10dc0 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lPtr;.    }else{
10dd0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
10de0 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
10df0 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c      pPage->xCell
10e00 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
10e10 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
10e20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
10e30 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
10e40 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
10e50 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
10e60 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
10e70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
10e80 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
10e90 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
10ea0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
10eb0 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
10ec0 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATA ){.    /* EV
10ed0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33  IDENCE-OF: R-433
10ee0 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65  16-37308 A value
10ef0 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61   of 2 (0x02) mea
10f00 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
10f10 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f  n.    ** interio
10f20 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  r index b-tree p
10f30 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
10f40 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
10f50 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20  A)==2 );.    /* 
10f60 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
10f70 39 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c  9615-42828 A val
10f80 75 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20  ue of 10 (0x0a) 
10f90 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
10fa0 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20  s a.    ** leaf 
10fb0 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
10fc0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
10fd0 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c  ( (PTF_ZERODATA|
10fe0 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b  PTF_LEAF)==10 );
10ff0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
11000 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
11010 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
11020 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  0;.    pPage->xP
11030 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
11040 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
11050 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  x;.    pPage->ma
11060 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
11070 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
11080 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
11090 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
110a0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
110b0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30  DENCE-OF: R-4760
110c0 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65  8-56469 Any othe
110d0 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  r value for the 
110e0 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
110f0 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   is.    ** an er
11100 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ror. */.    retu
11110 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11120 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
11130 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
11140 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
11150 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
11160 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
11170 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11180 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
11190 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
111a0 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
111b0 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
111c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
111d0 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
111e0 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
111f0 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
11200 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
11210 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
11220 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
11230 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
11240 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
11250 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
11260 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
11270 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
11280 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
11290 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
112a0 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
112b0 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
112c0 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
112d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
112e0 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
112f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
11300 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  {.  int pc;     
11310 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
11320 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
11330 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
11340 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 68  Data[] */.  u8 h
11350 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
11360 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
11370 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
11380 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ader */.  u8 *da
11390 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
113a0 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
113b0 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61  aData */.  BtSha
113c0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
113d0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
113e0 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
113f0 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
11400 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
11410 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
11420 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
11430 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
11440 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
11450 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
11460 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
11470 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
11480 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
11490 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
114a0 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
114b0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  page */.  int to
114c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
114d0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
114e0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
114f0 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  rea */.  int iCe
11500 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
11510 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
11520 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
11530 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74   offset */.  int
11540 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
11550 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
11560 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
11570 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
11580 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11590 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
115a0 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64  t( pPage->pBt->d
115b0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
115c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
115d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
115e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
115f0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
11600 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
11610 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
11620 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
11630 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
11640 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
11650 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
11660 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
11670 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
11680 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11690 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
116a0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
116b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d  ( pPage->isInit=
116c0 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70  =0 );..  pBt = p
116d0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68 64 72  Page->pBt;.  hdr
116e0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
116f0 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  set;.  data = pP
11700 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a  age->aData;.  /*
11710 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11720 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
11730 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
11740 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
11750 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d  ting.  ** the b-
11760 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20  tree page type. 
11770 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46  */.  if( decodeF
11780 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
11790 5b 68 64 72 5d 29 20 29 7b 0a 20 20 20 20 72 65  [hdr]) ){.    re
117a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
117b0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
117c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
117d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
117e0 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
117f0 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
11800 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
11810 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
11820 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
11830 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
11840 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  0;.  usableSize 
11850 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
11860 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  e;.  pPage->cell
11870 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
11880 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  set = hdr + 8 + 
11890 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
118a0 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ize;.  pPage->aD
118b0 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
118c0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
118d0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
118e0 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
118f0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
11900 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
11910 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
11920 65 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  e];.  /* EVIDENC
11930 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38  E-OF: R-58015-48
11940 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65  175 The two-byte
11950 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
11960 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a  et 5 designates.
11970 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
11980 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
11990 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
119a0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
119b0 6e 74 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69  nteger is.  ** i
119c0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35  nterpreted as 65
119d0 35 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  536. */.  top = 
119e0 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
119f0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
11a00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
11a10 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54   R-37002-32774 T
11a20 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
11a30 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20  ger at offset 3 
11a40 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e  gives the.  ** n
11a50 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
11a60 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
11a70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
11a80 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
11a90 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50  dr+3]);.  if( pP
11aa0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
11ab0 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  LL(pBt) ){.    /
11ac0 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
11ad0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
11ae0 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
11af0 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
11b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11b10 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
11b20 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74 65 73  Page);.  }.  tes
11b30 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
11b40 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
11b50 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  ) );.  /* EVIDEN
11b60 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35  CE-OF: R-24089-5
11b70 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63  7979 If a page c
11b80 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
11b90 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a   (which is only.
11ba0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
11bb0 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
11bc0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
11bd0 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
11be0 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66  then the.  ** of
11bf0 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
11c00 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
11c10 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
11c20 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
11c30 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72  .  ** bytes of r
11c40 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a  eserved space. *
11c50 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
11c60 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f  e->nCell>0 || to
11c70 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  p==usableSize ||
11c80 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a   CORRUPT_DB );..
11c90 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
11ca0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
11cb0 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f  ight cause us to
11cc0 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
11cd0 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  nd.  ** of page 
11ce0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
11cf0 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ell.  .  **.  **
11d00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
11d10 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65  lock of code che
11d20 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65  cks early to see
11d30 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e   if a cell exten
11d40 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68 65  ds.  ** past the
11d50 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
11d60 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
11d70 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
11d80 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65  T to be .  ** re
11d90 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
11da0 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46  s..  */.  iCellF
11db0 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
11dc0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
11dd0 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
11de0 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
11df0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d  ;.  if( pBt->db-
11e00 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
11e10 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
11e20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11e30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
11e40 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
11e50 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
11e60 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
11e70 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
11e80 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ell */..    if( 
11e90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
11ea0 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
11eb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
11ec0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
11ed0 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
11ee0 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
11ef0 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
11f00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11f10 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
11f20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11f30 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
11f40 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
11f50 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
11f60 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
11f70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
11f80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
11f90 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
11fa0 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 50   }.      sz = pP
11fb0 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
11fc0 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
11fd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11fe0 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53  ( pc+sz==usableS
11ff0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
12000 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
12010 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e ){.        ret
12020 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12030 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
12040 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12050 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
12060 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
12070 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f  ;.  }  ..  /* Co
12080 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
12090 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
120a0 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44  e page.  ** EVID
120b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38  ENCE-OF: R-23588
120c0 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62  -34450 The two-b
120d0 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
120e0 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68  ffset 1 gives th
120f0 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20  e.  ** start of 
12100 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
12110 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  ock on the page,
12120 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74   or is zero if t
12130 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
12140 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a   freeblocks. */.
12150 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
12160 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
12170 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
12180 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
12190 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
121a0 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
121b0 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20   space */.  if( 
121c0 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  pc>0 ){.    u32 
121d0 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
121e0 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
121f0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t ){.      /* EV
12200 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
12210 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
12220 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
12230 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
12240 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79  l.      ** alway
12250 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  s be at least on
12260 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68  e cell before th
12270 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
12280 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
12290 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
122a0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
122b0 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  ge); .    }.    
122c0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
122d0 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61    if( pc>iCellLa
122e0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
122f0 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74   Freeblock off t
12300 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
12310 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
12320 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12330 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
12340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
12350 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
12360 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
12370 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
12380 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
12390 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
123a0 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
123b0 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69   if( next<=pc+si
123c0 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  ze+3 ) break;.  
123d0 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
123e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78     }.    if( nex
123f0 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  t>0 ){.      /* 
12400 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e  Freeblock not in
12410 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
12420 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
12430 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
12440 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
12450 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69   }.    if( pc+si
12460 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ze>(unsigned int
12470 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  )usableSize ){. 
12480 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65       /* Last fre
12490 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70  eblock extends p
124a0 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a  ast page end */.
124b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
124c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
124d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
124e0 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
124f0 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
12500 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
12510 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
12520 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
12530 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
12540 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
12550 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
12560 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a  bytes within.  *
12570 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
12580 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
12590 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
125a0 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
125b0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  .  ** of the pag
125c0 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
125d0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
125e0 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
125f0 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20  lso.  ** serves 
12600 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
12610 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
12620 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
12630 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  ll-content.  ** 
12640 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
12650 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
12660 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
12670 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  the page..  */. 
12680 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
12690 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  eSize ){.    ret
126a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
126b0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
126c0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
126d0 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
126e0 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
126f0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
12700 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
12710 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12720 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
12730 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
12740 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
12750 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
12760 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
12770 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12780 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
12790 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
127a0 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
127b0 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
127c0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
127d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
127e0 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
127f0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
12800 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
12810 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
12820 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
12830 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
12840 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
12850 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
12860 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
12870 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
12880 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
12890 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
128a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
128b0 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
128c0 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
128d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
128e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
128f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
12900 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
12910 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12920 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
12930 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
12940 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
12950 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65  SECURE ){.    me
12960 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
12970 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
12980 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
12990 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
129a0 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
129b0 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61  st = hdr + ((fla
129c0 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
129d0 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d  ? 12 : 8);.  mem
129e0 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
129f0 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
12a00 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
12a10 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
12a20 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
12a30 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
12a40 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
12a50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
12a60 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
12a70 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
12a80 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  gs);.  pPage->ce
12a90 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
12aa0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
12ab0 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d  End = &data[pBt-
12ac0 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
12ad0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
12ae0 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a  = &data[first];.
12af0 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66    pPage->aDataOf
12b00 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  st = &data[pPage
12b10 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
12b20 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
12b30 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
12b40 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
12b50 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
12b60 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
12b70 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
12b80 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
12b90 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
12ba0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
12bb0 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
12bc0 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  it = 1;.}.../*.*
12bd0 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61  * Convert a DbPa
12be0 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
12bf0 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20   the pager into 
12c00 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62  a MemPage used b
12c10 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c  y.** the btree l
12c20 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
12c30 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
12c40 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50  geFromDbPage(DbP
12c50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67  age *pDbPage, Pg
12c60 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65  no pgno, BtShare
12c70 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
12c80 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d  ge *pPage = (Mem
12c90 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
12ca0 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
12cb0 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21  ge);.  if( pgno!
12cc0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a  =pPage->pgno ){.
12cd0 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
12ce0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
12cf0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
12d00 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50  .    pPage->pDbP
12d10 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
12d20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
12d30 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  pBt;.    pPage->
12d40 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
12d50 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
12d60 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  t = pgno==1 ? 10
12d70 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  0 : 0;.  }.  ass
12d80 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
12d90 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
12da0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
12db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
12dc0 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
12dd0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
12de0 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
12df0 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
12e00 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
12e10 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
12e20 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65  s if needed.  Se
12e30 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74  e also: btreeGet
12e40 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a  UnusedPage()..**
12e50 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52  .** If the PAGER
12e60 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66  _GET_NOCONTENT f
12e70 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
12e80 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
12e90 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75  not care.** abou
12ea0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
12eb0 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
12ec0 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
12ed0 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
12ee0 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
12ef0 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
12f00 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
12f10 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
12f20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
12f30 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
12f40 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
12f50 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
12f60 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
12f70 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
12f80 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
12f90 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
12fa0 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
12fb0 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
12fc0 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
12fd0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
12fe0 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
12ff0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
13000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
13010 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
13020 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
13030 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
13040 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
13050 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
13060 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
13070 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
13080 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
13090 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
130a0 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
130b0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
130c0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
130d0 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
130e0 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
130f0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
13100 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
13110 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f  gs==PAGER_GET_NO
13120 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73  CONTENT || flags
13130 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ==PAGER_GET_READ
13140 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74  ONLY );.  assert
13150 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13160 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13170 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13180 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
13190 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
131a0 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
131b0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
131c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
131d0 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
131e0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
131f0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
13200 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
13210 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13220 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67  * Retrieve a pag
13230 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
13240 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72   cache. If the r
13250 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
13260 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20   not.** already 
13270 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
13280 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  he return NULL. 
13290 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
132a0 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
132b0 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
132c0 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
132d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  ed..*/.static Me
132e0 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
132f0 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20  Lookup(BtShared 
13300 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
13310 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
13320 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
13330 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13340 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13350 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
13360 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
13370 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
13380 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
13390 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
133a0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
133b0 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
133c0 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  o, pBt);.  }.  r
133d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
133e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
133f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13400 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
13410 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
13420 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f   kind of.** erro
13430 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69  r, return ((unsi
13440 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f  gned int)-1)..*/
13450 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72  .static Pgno btr
13460 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68  eePagecount(BtSh
13470 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65  ared *pBt){.  re
13480 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b  turn pBt->nPage;
13490 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  .}.u32 sqlite3Bt
134a0 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65  reeLastPage(Btre
134b0 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
134c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
134d0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
134e0 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74  assert( ((p->pBt
134f0 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30  ->nPage)&0x80000
13500 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
13510 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
13520 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
13530 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
13540 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
13550 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
13560 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21  ..**.** If pCur!
13570 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
13580 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65   is being fetche
13590 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d  d as part of a m
135a0 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20  oveToChild().** 
135b0 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69  call.  Do additi
135c0 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
135d0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
135e0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
135f0 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74  * And if the fet
13600 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
13610 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
13620 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
13630 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
13640 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
13650 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
13660 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
13670 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
13680 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
13690 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
136a0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
136b0 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
136c0 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
136d0 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
136e0 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
136f0 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
13700 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
13710 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
13720 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
13730 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
13740 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
13750 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
13760 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
13790 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
137a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
137b0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
137c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
137d0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
137e0 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
137f0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
13800 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
13810 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
13820 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
13830 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
13840 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
13850 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
13860 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
13870 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
13880 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
13890 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
138a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
138b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
138c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
138d0 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
138e0 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
138f0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
13900 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75  | bReadOnly==pCu
13910 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
13920 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
13930 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69  ur==0 || pCur->i
13940 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28  Page>0 );..  if(
13950 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
13960 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
13970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
13980 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
13990 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
139a0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
139b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
139c0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
139d0 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
139e0 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
139f0 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
13a00 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
13a10 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
13a20 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  r;.  }.  *ppPage
13a30 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
13a40 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
13a50 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
13a60 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  ( (*ppPage)->isI
13a70 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74  nit==0 ){.    bt
13a80 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
13a90 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
13aa0 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20   pBt);.    rc = 
13ab0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  btreeInitPage(*p
13ac0 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
13ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13ae0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13af0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
13b00 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
13b10 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
13b20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
13b30 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
13b40 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
13b50 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
13b60 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
13b70 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
13b80 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ge) );..  /* If 
13b90 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c  obtaining a chil
13ba0 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72  d page for a cur
13bb0 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72  sor, we must ver
13bc0 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
13bd0 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74  e is.  ** compat
13be0 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f  ible with the ro
13bf0 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66  ot page. */.  if
13c00 28 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50  ( pCur && ((*ppP
13c10 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  age)->nCell<1 ||
13c20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b   (*ppPage)->intK
13c30 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey!=pCur->curInt
13c40 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  Key) ){.    rc =
13c50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13c60 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20  PGNO(pgno);.    
13c70 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
13c80 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67  age);.    goto g
13c90 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
13ca0 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ror;.  }.  retur
13cb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65  n SQLITE_OK;..ge
13cc0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
13cd0 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29  or:.  if( pCur )
13ce0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  {.    pCur->iPag
13cf0 65 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  e--;.    pCur->p
13d00 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
13d10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
13d20 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
13d30 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
13d40 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
13d50 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
13d60 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
13d70 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
13d80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
13d90 55 52 52 45 4e 54 0a 2f 2a 20 0a 2a 2a 20 53 65  URRENT./* .** Se
13da0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
13db0 68 65 20 4d 65 6d 50 61 67 65 2e 70 67 6e 6f 52  he MemPage.pgnoR
13dc0 6f 6f 74 20 76 61 72 69 61 62 6c 65 2c 20 69 66  oot variable, if
13dd0 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73   it exists..*/.s
13de0 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4d 65  tatic void setMe
13df0 6d 70 61 67 65 52 6f 6f 74 28 4d 65 6d 50 61 67  mpageRoot(MemPag
13e00 65 20 2a 70 50 67 2c 20 75 33 32 20 70 67 6e 6f  e *pPg, u32 pgno
13e10 52 6f 6f 74 29 7b 0a 20 20 70 50 67 2d 3e 70 67  Root){.  pPg->pg
13e20 6e 6f 52 6f 6f 74 20 3d 20 70 67 6e 6f 52 6f 6f  noRoot = pgnoRoo
13e30 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
13e40 69 6e 65 20 73 65 74 4d 65 6d 70 61 67 65 52 6f  ine setMempageRo
13e50 6f 74 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  ot(x,y).#endif..
13e60 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
13e70 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
13e80 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
13e90 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
13ea0 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
13eb0 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a  treeGetPage..**.
13ec0 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20 73 70  ** Page1 is a sp
13ed0 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64 20 6d  ecial case and m
13ee0 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64 20  ust be released 
13ef0 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50 61 67  using releasePag
13f00 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  eOne()..*/.stati
13f10 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
13f20 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67  geNotNull(MemPag
13f30 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73  e *pPage){.  ass
13f40 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
13f50 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
13f60 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
13f70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
13f80 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
13f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13fa0 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
13fb0 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
13fc0 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
13fd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13fe0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
13ff0 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
14000 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
14010 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14020 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
14030 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
14040 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
14050 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
14060 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74  ->pDbPage);.}.st
14070 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
14080 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
14090 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
140a0 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65  ge ) releasePage
140b0 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a  NotNull(pPage);.
140c0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
140d0 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d  leasePageOne(Mem
140e0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
140f0 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30  assert( pPage!=0
14100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
14110 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
14120 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
14130 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
14140 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d  pPage->pDbPage!=
14150 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
14160 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
14170 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
14180 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
14190 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
141a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
141b0 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
141c0 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
141d0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
141e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
141f0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
14200 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
14210 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65  e3PagerUnrefPage
14220 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  One(pPage->pDbPa
14230 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge);.}../*.** Ge
14240 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65  t an unused page
14250 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ..**.** This wor
14260 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72  ks just like btr
14270 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68  eeGetPage() with
14280 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a   the addition:.*
14290 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65  *.**   *  If the
142a0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
142b0 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65   in use for some
142c0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20   other purpose, 
142d0 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
142e0 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61      release it a
142f0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
14300 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f  ITE_CURRUPT erro
14310 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20  r..**   *  Make 
14320 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20  sure the isInit 
14330 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f  flag is clear.*/
14340 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
14350 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a  eGetUnusedPage(.
14360 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
14370 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
14380 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
14390 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
143a0 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
143b0 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
143c0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
143d0 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
143e0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
143f0 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
14400 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
14410 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
14420 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
14430 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
14440 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
14450 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
14460 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
14470 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
14480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14490 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
144a0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
144b0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
144c0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
144d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
144e0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
144f0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
14500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14510 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14520 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
14530 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
14540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
14550 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
14560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
14570 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
14580 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
14590 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
145a0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
145b0 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
145c0 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
145d0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
145e0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
145f0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
14600 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
14610 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
14620 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
14630 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
14640 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
14650 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
14660 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
14670 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
14680 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
14690 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
146a0 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
146b0 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
146c0 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
146d0 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
146e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
146f0 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
14700 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
14710 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
14720 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
14730 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
14740 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
14750 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
14760 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
14770 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14780 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
14790 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
147a0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
147b0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
147c0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
147d0 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
147e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
147f0 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
14800 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
14810 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
14820 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
14830 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
14840 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
14850 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
14860 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
14870 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
14880 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
14890 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
148a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
148b0 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
148c0 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
148d0 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
148e0 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
148f0 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
14900 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
14910 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
14920 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
14930 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
14940 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
14950 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
14960 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
14970 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
14980 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
14990 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
149a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
149b0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
149c0 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
149d0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
149e0 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
149f0 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
14a00 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
14a10 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
14a20 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
14a30 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
14a40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14a50 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14a60 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
14a70 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
14a80 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
14a90 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
14aa0 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20 20 20  ndler,.         
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14ad0 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
14ae0 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Pager));.}../*.*
14af0 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
14b00 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
14b10 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
14b20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
14b30 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
14b40 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
14b50 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
14b60 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
14b70 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
14b80 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
14b90 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
14ba0 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
14bb0 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
14bc0 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
14bd0 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
14be0 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
14bf0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
14c00 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
14c10 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
14c20 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
14c30 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
14c40 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
14c50 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
14c60 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
14c70 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
14c80 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
14c90 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
14ca0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
14cb0 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
14cc0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
14cd0 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
14ce0 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
14cf0 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
14d00 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a  ntain bits like.
14d10 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  ** BTREE_OMIT_JO
14d20 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52  URNAL and/or BTR
14d30 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  EE_MEMORY..**.**
14d40 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
14d50 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
14d60 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
14d70 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14d80 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
14d90 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
14da0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
14db0 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
14dc0 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
14dd0 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
14de0 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
14df0 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
14e00 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
14e10 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
14e20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14e30 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
14e40 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
14e50 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
14e60 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
14e70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
14e80 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
14e90 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
14ea0 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
14eb0 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
14ec0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
14ed0 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
14ee0 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
14ef0 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
14f00 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
14f10 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
14f20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
14f30 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
14f40 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
14f50 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
14f60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
14f70 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
14f80 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
14f90 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
14fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
14fb0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
14fc0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
14fd0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
14fe0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
14ff0 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
15000 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
15010 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
15020 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
15030 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
15040 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
15050 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15070 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
15080 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
15090 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
150a0 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
150b0 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
150c0 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
150d0 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
150e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
150f0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
15100 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
15110 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
15120 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
15130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
15140 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
15150 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
15160 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
15170 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
15180 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
15190 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
151a0 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
151b0 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
151c0 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
151d0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
151e0 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
151f0 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
15200 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
15210 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
15220 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
15230 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
15240 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
15250 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
15260 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
15270 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
15280 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
15290 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
152a0 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
152b0 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
152c0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
152d0 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
152e0 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
152f0 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
15300 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
15320 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
15330 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
15340 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20  y(db)).         
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
15360 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
15370 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
15380 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  !=0;.#endif..  a
15390 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
153a0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
153b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
153c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
153d0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
153e0 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
153f0 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
15400 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
15410 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
15420 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
15430 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
15440 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
15450 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
15460 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
15470 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
15480 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
15490 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
154a0 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
154b0 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
154c0 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
154d0 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
154e0 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
154f0 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
15500 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
15510 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
15520 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
15530 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45    flags |= BTREE
15540 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69  _MEMORY;.  }.  i
15550 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  f( (vfsFlags & S
15560 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
15570 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d  DB)!=0 && (isMem
15580 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20  db || isTempDb) 
15590 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20  ){.    vfsFlags 
155a0 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53  = (vfsFlags & ~S
155b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
155c0 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  DB) | SQLITE_OPE
155d0 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20  N_TEMP_DB;.  }. 
155e0 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
155f0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
15600 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
15610 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15620 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
15630 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
15640 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
15650 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
15660 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15670 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
15680 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
15690 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
156a0 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
156b0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
156c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
156d0 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
156e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
156f0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
15700 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
15710 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
15720 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
15730 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
15740 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
15750 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
15760 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
15770 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
15780 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26  ( isTempDb==0 &&
15790 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20   (isMemdb==0 || 
157a0 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
157b0 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29  _OPEN_URI)!=0) )
157c0 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
157d0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
157e0 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
157f0 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
15800 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
15810 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
15820 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  +1;.      int nF
15830 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
15840 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
15850 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
15860 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
15870 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28  lite3Malloc(MAX(
15880 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46  nFullPathname,nF
15890 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ilename));.     
158a0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
158b0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
158c0 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20  exShared; )..   
158d0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
158e0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
158f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
15900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15910 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
15920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15930 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
15940 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d   }.      if( isM
15950 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
15960 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68  memcpy(zFullPath
15970 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  name, zFilename,
15980 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   nFilename);.   
15990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
159a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
159b0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
159c0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
15a00 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
15a10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
15a20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
15a30 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
15a40 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
15a50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15a60 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
15a70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
15a80 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
15a90 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
15aa0 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
15ab0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15ac0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
15ad0 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
15ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
15af0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
15b00 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
15b10 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
15b20 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15b30 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15b40 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
15b50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15b60 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
15b70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
15b80 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
15b90 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
15ba0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
15bb0 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
15bc0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
15bd0 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
15be0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
15bf0 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
15c00 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
15c10 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
15c20 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
15c50 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
15c60 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
15c70 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
15c80 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
15c90 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
15ca0 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
15cb0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
15cc0 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
15cd0 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
15ce0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
15cf0 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
15d00 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15d20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15d30 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15d50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15d60 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
15d70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15d80 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
15d90 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
15da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15db0 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
15dc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15dd0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
15de0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15e00 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
15e10 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
15e20 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
15e30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15e40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15e50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15e60 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
15e70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15e80 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
15e90 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
15ea0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
15eb0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
15ec0 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
15ed0 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
15ee0 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
15ef0 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
15f00 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
15f10 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
15f20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
15f30 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
15f40 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
15f50 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
15f60 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
15f70 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
15f80 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
15f90 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
15fa0 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
15fb0 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
15fc0 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
15fd0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
15fe0 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
15ff0 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
16000 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
16010 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
16020 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
16030 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
16040 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
16050 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
16060 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
16070 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
16080 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
16090 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
160a0 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
160b0 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
160c0 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
160d0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
160e0 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
160f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
16100 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b  izeof(u64)==8 );
16110 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
16120 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
16130 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16140 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
16150 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16160 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
16170 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
16180 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
16190 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
161a0 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
161b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
161c0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
161d0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
161e0 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
161f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16200 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
16210 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
16220 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c  sizeof(MemPage),
16250 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
16260 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
16270 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
16290 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
162a0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
162b0 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
162c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
162d0 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
162e0 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
162f0 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
16300 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
16310 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
16320 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16330 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
16340 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
16350 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
16360 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
16370 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
16380 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
16390 67 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65  gerSetBusyHandle
163a0 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
163b0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
163c0 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
163d0 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
163e0 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
163f0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
16400 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
16410 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
16420 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
16430 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
16440 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
16450 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64  READ_ONLY;.#if d
16460 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45  efined(SQLITE_SE
16470 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20  CURE_DELETE).   
16480 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
16490 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
164a0 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  ETE;.#elif defin
164b0 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53  ed(SQLITE_FAST_S
164c0 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20  ECURE_DELETE).  
164d0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
164e0 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  |= BTS_OVERWRITE
164f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
16500 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
16510 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70  1873-39618 The p
16520 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64  age size for a d
16530 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
16540 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
16550 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20  d by the 2-byte 
16560 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20  integer located 
16570 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
16580 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20  16 bytes from.  
16590 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69    ** the beginni
165a0 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
165b0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
165c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
165d0 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c  (zDbHeader[16]<<
165e0 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b  8) | (zDbHeader[
165f0 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
16600 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
16610 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
16620 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
16630 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
16640 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
16650 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
16660 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
16670 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
16680 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
16690 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
166a0 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
166b0 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
166c0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
166d0 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
166e0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
166f0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
16700 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
16710 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
16720 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
16730 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
16740 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
16750 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
16760 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
16770 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
16780 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
16790 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
167a0 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
167b0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
167c0 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
167d0 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
167e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
167f0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
16800 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
16810 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
16820 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
16830 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
16840 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
16850 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
16860 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
16870 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
16880 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
16890 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
168a0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
168b0 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
168c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
168d0 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
168e0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
168f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
16900 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
16910 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
16920 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
16930 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  gion is.      **
16940 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
16950 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
16960 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
16970 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
16980 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69  of 20.      ** i
16990 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
169a0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
169b0 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
169c0 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
169d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
169e0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
169f0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
16a00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16a10 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
16a20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
16a30 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
16a40 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
16a50 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
16a60 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
16a70 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
16a80 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
16a90 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
16aa0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
16ab0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
16ac0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
16ad0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
16ae0 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
16af0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
16b00 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
16b10 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
16b20 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
16b30 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
16b40 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
16b50 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
16b60 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
16b70 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
16b80 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
16b90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16ba0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16bb0 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
16bc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
16bd0 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
16be0 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
16bf0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
16c00 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
16c10 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
16c20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52    */.    pBt->nR
16c30 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ef = 1;.    if( 
16c40 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
16c50 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
16c60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
16c70 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
16c80 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
16c90 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d  C( mutexShared =
16ca0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
16cb0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16cc0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29  STATIC_MASTER);)
16cd0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
16ce0 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
16cf0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16d00 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
16d10 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
16d20 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
16d30 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
16d40 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
16d50 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
16d60 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
16d70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16d80 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
16d90 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
16da0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
16db0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16dc0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
16dd0 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
16de0 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
16df0 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
16e00 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
16e10 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
16e20 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
16e30 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
16e40 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
16e50 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
16e60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
16e70 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
16e80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
16e90 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
16ea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16eb0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
16ec0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16ed0 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
16ee0 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
16ef0 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
16f00 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
16f10 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
16f20 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
16f30 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
16f40 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
16f50 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
16f60 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
16f70 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
16f80 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
16f90 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
16fa0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
16fb0 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
16fc0 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
16fd0 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
16fe0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
16ff0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
17000 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
17010 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
17020 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
17030 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
17040 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
17050 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
17060 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70 74          if( (upt
17070 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  r)p->pBt<(uptr)p
17080 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
17090 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
170a0 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
170b0 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
170c0 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
170d0 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
170e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
170f0 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
17100 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29 70  pNext && (uptr)p
17110 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
17120 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a  (uptr)p->pBt ){.
17130 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
17140 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
17150 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17160 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
17170 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
17180 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
17190 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
171a0 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
171b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
171c0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
171d0 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
171e0 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
171f0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
17200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
17210 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17220 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
17230 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
17240 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
17250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17260 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
17270 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
17280 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17290 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
172a0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
172b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
172c0 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
172d0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
172e0 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
172f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
17300 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
17310 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
17320 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
17330 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
17340 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
17350 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
17360 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
17370 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77  value. Except, w
17380 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61  hen opening on a
17390 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65  n existing share
173a0 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20  d pager-cache,. 
173b0 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61     ** do not cha
173c0 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
173d0 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  che size..    */
173e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
173f0 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30  BtreeSchema(p, 0
17400 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
17410 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
17420 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74  Cachesize(p->pBt
17430 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
17440 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
17450 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  IZE);.    }..   
17460 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   pFile = sqlite3
17470 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
17480 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
17490 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
174a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
174b0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
174c0 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  t(pFile, SQLITE_
174d0 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64  FCNTL_PDB, (void
174e0 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20  *)&pBt->db);.   
174f0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
17500 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
17510 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17520 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
17530 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
17540 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
17550 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
17560 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
17570 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
17580 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e  3BtreeConnection
17590 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e  Count(*ppBtree)>
175a0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
175b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
175c0 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
175d0 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
175e0 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
175f0 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
17600 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
17610 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
17620 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
17630 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
17640 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
17650 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
17660 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
17670 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
17680 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
17690 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
176a0 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
176b0 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
176c0 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
176d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
176e0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54  ARED_CACHE.  MUT
176f0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
17700 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
17710 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ; ).  BtShared *
17720 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
17730 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
17740 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17750 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
17760 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45  mutex) );.  MUTE
17770 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
17780 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
17790 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
177a0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
177b0 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
177c0 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
177d0 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
177e0 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
177f0 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
17800 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
17810 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
17820 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29  acheList)==pBt )
17830 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  {.      GLOBAL(B
17840 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
17850 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
17860 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
17870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17880 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pList = GLOBAL(B
17890 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
178a0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
178b0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
178c0 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
178d0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
178e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
178f0 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
17900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17910 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
17920 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
17930 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
17940 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
17950 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
17960 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
17970 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
17980 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
17990 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
179a0 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
179b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
179c0 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
179d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
179e0 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
179f0 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
17a00 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
17a10 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
17a20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
17a30 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
17a40 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
17a50 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d   bytes with a 4-
17a60 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20  byte prefix for 
17a70 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20  a left-child.** 
17a80 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
17a90 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
17aa0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
17ab0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
17ac0 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
17ad0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
17ae0 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
17af0 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
17b00 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  pageSize );..   
17b10 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75   /* One of the u
17b20 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70  ses of pBt->pTmp
17b30 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d  Space is to form
17b40 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a  at cells before.
17b50 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67      ** inserting
17b60 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61   them into a lea
17b70 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e  f page (function
17b80 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20   fillInCell()). 
17b90 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c  If.    ** a cell
17ba0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20   is less than 4 
17bb0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69  bytes in size, i
17bc0 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20  t is rounded up 
17bd0 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a  to 4 bytes.    *
17be0 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  * by the various
17bf0 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d   routines that m
17c00 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79  anipulate binary
17c10 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20   cells. Which.  
17c20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68    ** can mean th
17c30 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  at fillInCell() 
17c40 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73  only initializes
17c50 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20   the first 2 or 
17c60 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  3.    ** bytes o
17c70 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74  f pTmpSpace, but
17c80 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
17c90 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69  4 bytes are copi
17ca0 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69  ed from.    ** i
17cb0 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73  t into a databas
17cc0 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20  e page. This is 
17cd0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70  not actually a p
17ce0 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20  roblem, but it. 
17cf0 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65     ** does cause
17d00 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f   a valgrind erro
17d10 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20  r when the 1 or 
17d20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69  2 bytes of uniti
17d30 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64  alized .    ** d
17d40 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f  ata is passed to
17d50 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69   system call wri
17d60 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69  te(). So to avoi
17d70 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20  d this error,.  
17d80 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69    ** zero the fi
17d90 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
17da0 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a  emp space here..
17db0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
17dc0 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75  so:  Provide fou
17dd0 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69  r bytes of initi
17de0 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66  alized space bef
17df0 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62  ore the.    ** b
17e00 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70  eginning of pTmp
17e10 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61  Space as an area
17e20 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72   available to pr
17e30 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  epend the.    **
17e40 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e   left-child poin
17e50 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ter to the begin
17e60 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a  ning of a cell..
17e70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
17e80 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
17e90 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42  .      memset(pB
17ea0 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c  t->pTmpSpace, 0,
17eb0 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   8);.      pBt->
17ec0 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a  pTmpSpace += 4;.
17ed0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17ee0 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
17ef0 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
17f00 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
17f10 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
17f20 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
17f30 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54  ){.  if( pBt->pT
17f40 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
17f50 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d  Bt->pTmpSpace -=
17f60 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   4;.    sqlite3P
17f70 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d  ageFree(pBt->pTm
17f80 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74  pSpace);.    pBt
17f90 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
17fa0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
17fb0 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
17fc0 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
17fd0 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
17fe0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17ff0 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
18000 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
18010 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
18020 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
18030 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
18040 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
18050 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
18060 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
18070 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18080 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
18090 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
180a0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
180b0 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
180c0 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
180d0 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
180e0 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
180f0 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
18100 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
18110 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
18120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
18130 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
18140 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
18150 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
18160 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
18170 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
18180 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
18190 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
181a0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
181b0 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
181c0 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
181d0 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
181e0 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
181f0 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
18200 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49  Rollback(p, SQLI
18210 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  TE_OK, 0);.  sql
18220 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18230 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
18240 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
18250 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
18260 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
18270 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
18280 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
18290 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
182a0 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
182b0 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
182c0 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
182d0 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
182e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
182f0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
18300 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
18310 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
18320 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
18330 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
18340 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
18350 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
18360 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
18370 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
18380 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
18390 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
183a0 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
183b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
183c0 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
183d0 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
183e0 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
183f0 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
18400 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
18410 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
18420 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
18430 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70  ->db);.    if( p
18440 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
18450 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
18460 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
18470 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
18480 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
18490 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
184a0 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
184b0 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
184c0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
184d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
184e0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
184f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
18500 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
18510 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
18520 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18530 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
18540 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
18550 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
18560 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
18570 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
18580 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
18590 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
185a0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
185b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
185c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
185d0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f  * Change the "so
185e0 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ft" limit on the
185f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18600 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
18610 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d  * Unused and unm
18620 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69  odified pages wi
18630 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77  ll be recycled w
18640 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
18650 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68  f.** pages in th
18660 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20  e cache exceeds 
18670 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e  this soft limit.
18680 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f    But the size o
18690 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69  f the.** cache i
186a0 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f  s allowed to gro
186b0 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  w larger than th
186c0 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63  is limit if it c
186d0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79  ontains.** dirty
186e0 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20   pages or pages 
186f0 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20  still in active 
18700 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
18710 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
18720 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
18730 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
18740 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18750 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
18760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18770 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
18780 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
18790 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
187a0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
187b0 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
187c0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
187d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
187e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
187f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18800 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70  * Change the "sp
18810 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  ill" limit on th
18820 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
18830 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
18840 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
18850 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64   of pages exceed
18860 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72  s this limit dur
18870 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
18880 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  saction,.** the 
18890 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65  pager might atte
188a0 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70  mpt to "spill" p
188b0 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  ages to the jour
188c0 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20  nal early in.** 
188d0 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
188e0 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
188f0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
18900 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74  d is the current
18910 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66   spill size.  If
18920 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a   zero is passed.
18930 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ** as an argumen
18940 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
18950 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70  e made to the sp
18960 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67  ill size setting
18970 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78  , so.** using mx
18980 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77  Page of 0 is a w
18990 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ay to query the 
189a0 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
189b0 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ze..*/.int sqlit
189c0 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
189d0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
189e0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
189f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18a00 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  pBt;.  int res;.
18a10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18a20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
18a30 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18a40 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18a50 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  r(p);.  res = sq
18a60 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
18a70 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  llsize(pBt->pPag
18a80 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
18a90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18aa0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (p);.  return re
18ab0 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  s;.}..#if SQLITE
18ac0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
18ad0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
18ae0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
18af0 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
18b00 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
18b10 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
18b20 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
18b30 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
18b40 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
18b50 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
18b60 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
18b70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18b80 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
18b90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18ba0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
18bb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18bc0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
18bd0 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
18be0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
18bf0 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
18c00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18c10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18c20 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
18c30 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
18c40 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
18c50 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
18c60 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
18c70 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
18c80 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
18c90 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
18ca0 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
18cb0 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
18cc0 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
18cd0 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
18ce0 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
18cf0 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
18d00 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
18d10 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
18d20 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
18d30 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
18d40 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
18d50 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
18d60 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
18d70 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
18d80 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
18d90 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
18da0 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
18db0 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
18dc0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
18dd0 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
18de0 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
18df0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
18e00 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
18e10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18e20 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
18e30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18e40 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
18e50 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
18e60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
18e70 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
18e80 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
18e90 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
18ea0 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
18eb0 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
18ec0 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
18ed0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
18ee0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
18ef0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18f00 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
18f10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18f20 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
18f30 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
18f40 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
18f50 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
18f60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18f70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f80 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
18f90 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
18fa0 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
18fb0 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
18fc0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
18fd0 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
18fe0 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
18ff0 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
19000 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
19010 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
19020 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
19030 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
19040 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
19050 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
19060 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
19070 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
19080 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
19090 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
190a0 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
190b0 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
190c0 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
190d0 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
190e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
190f0 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
19100 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
19110 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
19120 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
19130 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19140 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
19150 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
19160 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
19170 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
19180 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
19190 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
191a0 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
191b0 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
191c0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
191d0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
191e0 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
191f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
19200 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
19210 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
19220 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
19230 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
19240 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
19250 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
19260 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  he BTS_PAGESIZE_
19270 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65  FIXED flag is se
19280 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
19290 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
192a0 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
192b0 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
192c0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
192d0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
192e0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
192f0 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
19300 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
19310 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
19320 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19330 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19340 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
19350 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
19360 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
19370 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
19380 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20  eeEnter(p);.#if 
19390 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
193a0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e  .  if( nReserve>
193b0 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
193c0 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d  rve ) pBt->optim
193d0 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29  alReserve = (u8)
193e0 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  nReserve;.#endif
193f0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
19400 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
19410 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20  IZE_FIXED ){.   
19420 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19430 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
19440 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
19450 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
19460 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
19470 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
19480 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
19490 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
194a0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
194b0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
194c0 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
194d0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
194e0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
194f0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
19500 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
19510 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
19520 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
19530 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
19540 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
19550 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
19560 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
19570 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
19580 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
19590 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
195a0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
195b0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
195c0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
195d0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
195e0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
195f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
19600 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
19610 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
19620 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
19630 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
19640 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
19650 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19660 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19670 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
19680 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
19690 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
196a0 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
196b0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
196c0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
196d0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
196e0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
196f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19700 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
19710 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
19720 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74  eserve(), except
19730 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20   that it.** may 
19740 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69  only be called i
19750 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  f it is guarante
19760 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72  ed that the b-tr
19770 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65  ee mutex is alre
19780 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a  ady.** held..**.
19790 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75  ** This is usefu
197a0 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c  l in one special
197b0 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63   case in the bac
197c0 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65  kup API code whe
197d0 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77  re it is.** know
197e0 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65  n that the share
197f0 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
19800 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20  s held, but the 
19810 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a  mutex on the .**
19820 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19830 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73   that owns *p is
19840 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61   not. In this ca
19850 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72  se if sqlite3Btr
19860 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72  eeEnter().** wer
19870 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20  e to be called, 
19880 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65  it might collide
19890 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72   with some other
198a0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
198b0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  e.** database ha
198c0 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
198d0 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66  p, causing undef
198e0 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a  ined behavior..*
198f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19900 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
19910 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tex(Btree *p){. 
19920 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74   int n;.  assert
19930 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
19940 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
19950 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  ex) );.  n = p->
19960 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
19970 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
19980 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ze;.  return n;.
19990 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
199a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
199b0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
199c0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
199d0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
199e0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
199f0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
19a00 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
19a10 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
19a20 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
19a30 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
19a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
19a50 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64  E_HAS_MUTEX is d
19a60 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20  efined then the 
19a70 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
19a80 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65  is the.** greate
19a90 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  r of the current
19aa0 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
19ab0 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
19ac0 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73  requested.** res
19ad0 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69  erve space..*/.i
19ae0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
19af0 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  etOptimalReserve
19b00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
19b10 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
19b20 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
19b30 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
19b40 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
19b50 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (p);.#ifdef SQLI
19b60 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
19b70 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74  f( n<p->pBt->opt
19b80 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20  imalReserve ) n 
19b90 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  = p->pBt->optima
19ba0 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  lReserve;.#endif
19bb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19bc0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19bd0 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
19be0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
19bf0 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
19c00 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
19c10 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
19c20 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
19c30 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
19c40 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
19c50 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
19c60 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
19c70 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
19c80 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
19c90 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
19ca0 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
19cb0 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
19cc0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
19cd0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
19ce0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
19cf0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
19d00 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
19d10 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
19d20 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
19d30 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19d40 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
19d50 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
19d60 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42  values for the B
19d70 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
19d80 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
19d90 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  TE flags:.**.** 
19da0 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20     newFlag==0   
19db0 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43      Both BTS_SEC
19dc0 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42  URE_DELETE and B
19dd0 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65  TS_OVERWRITE are
19de0 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e   cleared.**    n
19df0 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20  ewFlag==1       
19e00 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
19e10 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56  E set and BTS_OV
19e20 45 52 57 52 49 54 45 20 69 73 20 63 6c 65 61 72  ERWRITE is clear
19e30 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  ed.**    newFlag
19e40 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53 45  ==2       BTS_SE
19e50 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61  CURE_DELETE clea
19e60 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  red and BTS_OVER
19e70 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20  WRITE is set.** 
19e80 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29     newFlag==(-1)
19e90 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a      No changes.*
19ea0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19eb0 65 20 61 63 74 73 20 61 73 20 61 20 71 75 65 72  e acts as a quer
19ec0 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  y if newFlag is 
19ed0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a  less than zero.*
19ee0 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56  *.** With BTS_OV
19ef0 45 52 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c  ERWRITE set, del
19f00 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20  eted content is 
19f10 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a  overwritten by z
19f20 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65  eros, but.** fre
19f30 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  elist leaf pages
19f40 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e   are not written
19f50 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
19f60 61 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d  abase.  Thus in-
19f70 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  page.** deleted 
19f80 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72  content is clear
19f90 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74  ed, but freelist
19fa0 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74   deleted content
19fb0 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57   is not..**.** W
19fc0 69 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44  ith BTS_SECURE_D
19fd0 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e  ELETE, operation
19fe0 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45   is like BTS_OVE
19ff0 52 57 52 49 54 45 20 77 69 74 68 20 74 68 65 20  RWRITE with the 
1a000 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74  addition.** that
1a010 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70   freelist leaf p
1a020 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1a030 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
1a040 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73  atabase, increas
1a050 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e  ing.** the amoun
1a060 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a  t of disk I/O..*
1a070 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a080 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
1a090 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
1a0a0 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
1a0b0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1a0c0 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
1a0d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1a0e0 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45   assert( BTS_OVE
1a0f0 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55  RWRITE==BTS_SECU
1a100 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20  RE_DELETE*2 );. 
1a110 20 61 73 73 65 72 74 28 20 42 54 53 5f 46 41 53   assert( BTS_FAS
1a120 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f  T_SECURE==(BTS_O
1a130 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43  VERWRITE|BTS_SEC
1a140 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20  URE_DELETE) );. 
1a150 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
1a160 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
1a170 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1a180 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20  FAST_SECURE;.   
1a190 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
1a1a0 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
1a1b0 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a  DELETE*newFlag;.
1a1c0 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42    }.  b = (p->pB
1a1d0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1a1e0 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42  S_FAST_SECURE)/B
1a1f0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
1a200 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a210 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a220 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn b;.}../*.** C
1a230 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
1a240 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
1a250 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a260 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
1a270 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
1a280 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
1a290 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
1a2a0 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
1a2b0 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
1a2c0 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
1a2d0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1a2e0 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
1a2f0 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
1a300 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
1a310 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
1a320 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
1a330 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
1a340 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
1a350 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
1a360 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
1a370 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1a380 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1a390 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a3a0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
1a3b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a3c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1a3d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a3e0 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
1a3f0 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
1a400 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a410 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e  p);.  if( (pBt->
1a420 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1a430 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d  AGESIZE_FIXED)!=
1a440 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  0 && (av ?1:0)!=
1a450 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1a460 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a470 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1a480 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
1a490 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
1a4a0 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
1a4b0 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
1a4c0 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
1a4d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1a4e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a4f0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1a500 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
1a510 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
1a520 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
1a530 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
1a540 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
1a550 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1a560 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
1a570 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a580 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
1a590 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
1a5a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1a5b0 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
1a5c0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
1a5d0 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
1a5e0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1a5f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1a600 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
1a610 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
1a620 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
1a630 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
1a640 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
1a650 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
1a660 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
1a670 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
1a680 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
1a690 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a6a0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
1a6b0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  f.}../*.** If th
1a6c0 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73  e user has not s
1a6d0 65 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65  et the safety-le
1a6e0 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74  vel for this dat
1a6f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1a700 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d  .** using "PRAGM
1a710 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20  A synchronous", 
1a720 61 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74  and if the safet
1a730 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61  y-level is not a
1a740 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f  lready.** set to
1a750 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
1a760 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1a770 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  on as the second
1a780 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73   parameter,.** s
1a790 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66  et it so..*/.#if
1a7a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1a7b0 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c  SYNCHRONOUS!=SQL
1a7c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
1a7d0 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20  SYNCHRONOUS \.  
1a7e0 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51    && !defined(SQ
1a7f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73  LITE_OMIT_WAL).s
1a800 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65  tatic void setDe
1a810 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 42 74  faultSyncFlag(Bt
1a820 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75 38 20  Shared *pBt, u8 
1a830 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20  safety_level){. 
1a840 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1a850 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28 20 28  Db *pDb;.  if( (
1a860 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26  db=pBt->db)!=0 &
1a870 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21  & (pDb=db->aDb)!
1a880 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
1a890 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20   pDb->pBt==0 || 
1a8a0 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70  pDb->pBt->pBt!=p
1a8b0 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20  Bt ){ pDb++; }. 
1a8c0 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e     if( pDb->bSyn
1a8d0 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20 26 26  cSet==0 .     &&
1a8e0 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
1a8f0 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c  el!=safety_level
1a900 20 0a 20 20 20 20 20 26 26 20 70 44 62 21 3d 26   .     && pDb!=&
1a910 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20  db->aDb[1] .    
1a920 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 61  ){.      pDb->sa
1a930 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66  fety_level = saf
1a940 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20  ety_level;.     
1a950 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
1a960 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
1a970 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  r,.          pDb
1a980 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c  ->safety_level |
1a990 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41   (db->flags & PA
1a9a0 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29  GER_FLAGS_MASK))
1a9b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1a9c0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74  lse.# define set
1a9d0 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
1a9e0 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c  pBt,safety_level
1a9f0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1aa00 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
1aa10 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
1aa20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1aa30 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
1aa40 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
1aa50 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
1aa60 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
1aa70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1aa80 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
1aa90 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
1aaa0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
1aab0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1aac0 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
1aad0 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
1aae0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1aaf0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
1ab00 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
1ab10 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
1ab20 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
1ab30 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
1ab40 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
1ab50 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
1ab60 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
1ab70 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab90 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
1aba0 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
1abb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1abc0 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
1abd0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
1abe0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1abf0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1ac00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1ac10 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1ac20 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
1ac30 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
1ac40 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1ac50 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1ac60 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
1ac70 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
1ac80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1ac90 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
1aca0 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
1acb0 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
1acc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1acd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1ace0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1acf0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
1ad00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ad10 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
1ad20 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
1ad30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ad40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
1ad50 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1ad60 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
1ad70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
1ad80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1ad90 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
1ada0 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
1adb0 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
1adc0 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
1add0 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
1ade0 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
1adf0 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
1ae00 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
1ae10 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
1ae20 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1ae30 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
1ae40 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1ae50 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
1ae60 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
1ae70 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
1ae80 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
1ae90 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
1aea0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
1aeb0 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
1aec0 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
1aed0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
1aee0 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
1aef0 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
1af00 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
1af10 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
1af20 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
1af30 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
1af40 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1af50 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39  F: R-43737-39999
1af60 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c   Every valid SQL
1af70 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ite database fil
1af80 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20  e begins.    ** 
1af90 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
1afa0 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20  ng 16 bytes (in 
1afb0 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36  hex): 53 51 4c 6
1afc0 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66  9 74 65 20 66 6f
1afd0 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31   72 6d.    ** 61
1afe0 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f   74 20 33 00. */
1aff0 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
1b000 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
1b010 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
1b020 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1b030 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1b040 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1b050 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69  E_OMIT_WAL.    i
1b060 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
1b070 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
1b080 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
1b090 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
1b0a0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
1b0b0 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
1b0c0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1b0d0 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
1b0e0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
1b0f0 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
1b100 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1b110 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
1b120 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
1b130 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
1b140 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1b150 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
1b160 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
1b170 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
1b180 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
1b190 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
1b1a0 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
1b1b0 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
1b1c0 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
1b1d0 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
1b1e0 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
1b1f0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
1b200 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
1b210 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
1b220 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
1b230 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
1b240 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
1b250 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
1b260 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
1b270 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
1b280 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
1b290 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
1b2a0 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
1b2b0 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
1b2c0 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
1b2d0 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
1b2e0 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
1b2f0 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
1b300 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
1b310 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
1b320 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
1b330 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e  19]==2 && (pBt->
1b340 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e  btsFlags & BTS_N
1b350 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  O_WAL)==0 ){.   
1b360 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20     int isOpen = 
1b370 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
1b380 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
1b390 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  l(pBt->pPager, &
1b3a0 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  isOpen);.      i
1b3b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1b3d0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1b3e0 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ed;.      }else{
1b3f0 0a 20 20 20 20 20 20 20 20 73 65 74 44 65 66 61  .        setDefa
1b400 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
1b410 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1b420 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b  WAL_SYNCHRONOUS+
1b430 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1b440 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  isOpen==0 ){.   
1b450 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1b460 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20  geOne(pPage1);. 
1b470 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1b490 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b4a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1b4b0 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65  OTADB;.    }else
1b4c0 7b 0a 20 20 20 20 20 20 73 65 74 44 65 66 61 75  {.      setDefau
1b4d0 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20  ltSyncFlag(pBt, 
1b4e0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1b4f0 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20  YNCHRONOUS+1);. 
1b500 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1b510 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b520 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54   R-15465-20813 T
1b530 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d  he maximum and m
1b540 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  inimum embedded 
1b550 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66  payload.    ** f
1b560 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  ractions and the
1b570 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72   leaf payload fr
1b580 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75  action values mu
1b590 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e  st be 64, 32, an
1b5a0 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  d 32..    **.   
1b5b0 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
1b5c0 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
1b5d0 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
1b5e0 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
1b5f0 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
1b600 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
1b610 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
1b620 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1b630 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
1b640 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
1b650 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
1b660 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1b670 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1b680 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
1b690 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
1b6a0 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
1b6b0 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
1b6c0 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
1b6d0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1b6e0 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
1b6f0 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
1b700 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
1b710 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
1b720 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1b730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b740 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a  . */.    pageSiz
1b750 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c  e = (page1[16]<<
1b760 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c  8) | (page1[17]<
1b770 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  <16);.    /* EVI
1b780 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30  DENCE-OF: R-2500
1b790 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a 65  8-21688 The size
1b7a0 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61 20   of a page is a 
1b7b0 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20  power of two.   
1b7c0 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20   ** between 512 
1b7d0 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73  and 65536 inclus
1b7e0 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ive. */.    if( 
1b7f0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
1b800 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
1b810 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
1b820 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
1b830 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
1b840 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
1b850 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1b860 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1b870 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1b880 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
1b890 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  0 );.    /* EVID
1b8a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30  ENCE-OF: R-59310
1b8b0 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73 65  -51205 The "rese
1b8c0 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a 65  rved space" size
1b8d0 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20   in the 1-byte. 
1b8e0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74     ** integer at
1b8f0 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74 68   offset 20 is th
1b900 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1b910 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
1b920 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20  e end of.    ** 
1b930 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65 73  each page to res
1b940 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69  erve for extensi
1b950 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ons. .    **.   
1b960 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
1b970 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
1b980 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
1b990 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
1b9a0 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
1b9b0 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
1b9c0 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
1b9d0 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
1b9e0 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
1b9f0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
1ba00 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
1ba10 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c  er. */.    usabl
1ba20 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1ba30 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
1ba40 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
1ba50 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
1ba60 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
1ba70 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
1ba80 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1ba90 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
1baa0 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
1bab0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
1bac0 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
1bad0 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
1bae0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
1baf0 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
1bb00 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
1bb10 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
1bb20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
1bb30 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
1bb40 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
1bb50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bb60 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
1bb70 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
1bb80 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
1bb90 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
1bba0 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
1bbb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1bbc0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70  releasePageOne(p
1bbd0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
1bbe0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
1bbf0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
1bc00 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
1bc10 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
1bc20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
1bc30 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
1bc40 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
1bc50 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
1bc60 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
1bc70 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
1bca0 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
1bcb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1bcc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
1bcd0 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
1bce0 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
1bcf0 6d 61 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  ma)==0 && nPage>
1bd00 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
1bd10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1bd20 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1bd30 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1bd40 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1bd50 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1bd60 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
1bd70 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
1bd80 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
1bd90 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
1bda0 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
1bdb0 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
1bdc0 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
1bdd0 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
1bde0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
1bdf0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
1be00 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
1be10 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
1be20 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
1be30 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1be40 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1be50 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1be60 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
1be70 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
1be80 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
1be90 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
1bea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1beb0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
1bec0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
1bed0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
1bee0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
1bef0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
1bf00 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
1bf10 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
1bf20 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
1bf30 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
1bf40 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
1bf50 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
1bf60 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
1bf70 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
1bf80 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
1bf90 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
1bfa0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
1bfb0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
1bfc0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
1bfd0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
1bfe0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
1bff0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
1c000 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
1c010 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
1c020 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
1c030 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
1c040 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
1c050 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
1c060 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
1c070 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
1c080 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
1c090 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
1c0a0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
1c0b0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
1c0c0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
1c0d0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
1c0e0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
1c0f0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
1c100 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
1c110 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
1c120 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
1c130 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
1c140 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
1c150 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
1c160 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
1c170 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
1c180 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
1c190 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1c1a0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
1c1b0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
1c1c0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
1c1d0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1c1e0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
1c1f0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
1c200 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
1c210 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
1c220 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
1c230 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
1c240 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1c250 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
1c260 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
1c270 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
1c280 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
1c290 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
1c2a0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
1c2b0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
1c2c0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
1c2d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1c2e0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
1c2f0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
1c300 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
1c310 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
1c320 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1c330 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1c340 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
1c350 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
1c360 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70  releasePageOne(p
1c370 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
1c380 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
1c390 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1c3a0 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
1c3b0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1c3c0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65  r of cursors ope
1c3d0 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69  n on pBt. This i
1c3e0 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
1c3f0 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
1c400 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
1c410 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
1c420 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
1c430 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
1c440 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
1c450 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69  rs are counted i
1c460 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65  f wrOnly is true
1c470 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a  .  If wrOnly is.
1c480 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c  ** false then al
1c490 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  l cursors are co
1c4a0 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  unted..**.** For
1c4b0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
1c4c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
1c4d0 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63   cursor is any c
1c4e0 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
1c4f0 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64   capable of read
1c500 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1c510 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1c520 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
1c530 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
1c540 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
1c550 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
1c560 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
1c570 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1c580 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
1c590 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
1c5a0 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
1c5b0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
1c5c0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
1c5d0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
1c5e0 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
1c5f0 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
1c600 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
1c610 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
1c620 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
1c630 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
1c640 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
1c650 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
1c660 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
1c670 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
1c680 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
1c690 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1c6a0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
1c6b0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
1c6c0 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
1c6d0 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
1c6e0 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
1c6f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1c700 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
1c710 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
1c720 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1c730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c740 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
1c750 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
1c760 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
1c770 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
1c780 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
1c790 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1c7a0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
1c7b0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1c7c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
1c7d0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1c7e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1c7f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c800 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1c810 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1c820 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
1c830 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
1c840 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
1c850 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
1c860 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
1c870 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1c880 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
1c890 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
1c8a0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1c8b0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1c8c0 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e1;.    assert( 
1c8d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
1c8e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1c8f0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1c900 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
1c910 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  1 );.    pBt->pP
1c920 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65  age1 = 0;.    re
1c930 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61  leasePageOne(pPa
1c940 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
1c950 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
1c960 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
1c970 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
1c980 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
1c990 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
1c9a0 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
1c9b0 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
1c9c0 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
1c9d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1c9e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
1c9f0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
1ca00 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
1ca10 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
1ca20 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
1ca30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1ca40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ca50 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1ca60 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
1ca70 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
1ca80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ca90 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
1caa0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
1cab0 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
1cac0 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
1cad0 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
1cae0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1caf0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
1cb00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1cb10 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
1cb20 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
1cb30 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1cb40 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
1cb50 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1cb60 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
1cb70 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
1cb80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
1cb90 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
1cba0 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
1cbb0 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
1cbc0 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
1cbd0 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
1cbe0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
1cbf0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
1cc00 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
1cc10 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
1cc20 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
1cc30 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
1cc40 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
1cc50 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
1cc60 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
1cc70 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
1cc80 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
1cc90 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
1cca0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
1ccb0 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
1ccc0 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
1ccd0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
1cce0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
1ccf0 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
1cd00 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
1cd10 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
1cd20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1cd30 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
1cd40 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1cd50 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
1cd60 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
1cd70 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
1cd80 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
1cd90 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
1cda0 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
1cdb0 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
1cdc0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1cdd0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
1cde0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
1cdf0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
1ce00 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
1ce10 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
1ce20 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
1ce30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ce40 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1ce50 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1ce60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ce70 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
1ce80 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1ce90 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
1cea0 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
1ceb0 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
1cec0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1ced0 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
1cee0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
1cef0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
1cf00 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
1cf10 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
1cf20 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1cf30 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1cf40 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
1cf50 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
1cf60 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
1cf70 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
1cf80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1cf90 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1cfa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
1cfb0 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
1cfc0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
1cfd0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1cfe0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
1cff0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
1d000 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
1d010 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
1d020 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
1d030 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
1d040 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1d050 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
1d060 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
1d070 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1d080 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
1d090 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
1d0a0 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
1d0b0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1d0c0 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
1d0d0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
1d0e0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
1d0f0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
1d100 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
1d110 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
1d120 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
1d130 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
1d140 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
1d150 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
1d160 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1d170 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1d180 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
1d190 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
1d1a0 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
1d1b0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1d1c0 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
1d1d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
1d1e0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
1d1f0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
1d200 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1d210 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
1d220 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1d230 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
1d240 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1d250 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
1d260 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1d270 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
1d280 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1d290 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
1d2a0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1d2b0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
1d2c0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1d2d0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
1d2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1d2f0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
1d300 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
1d310 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
1d320 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
1d330 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
1d340 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
1d350 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
1d360 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
1d370 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
1d380 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
1d390 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
1d3a0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
1d3b0 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
1d3c0 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
1d3d0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
1d3e0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
1d3f0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
1d400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1d410 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
1d420 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
1d430 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1d440 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
1d450 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
1d460 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
1d470 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
1d480 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
1d490 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
1d4a0 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
1d4b0 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
1d4c0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1d4d0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
1d4e0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
1d4f0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
1d500 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
1d510 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
1d520 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
1d530 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
1d540 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
1d550 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
1d560 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
1d570 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
1d580 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
1d590 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
1d5a0 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
1d5b0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1d5c0 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
1d5d0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
1d5e0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
1d5f0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1d600 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
1d610 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
1d620 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
1d630 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
1d640 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1d650 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
1d660 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
1d670 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d680 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
1d690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d6a0 20 20 69 6e 74 20 62 43 6f 6e 63 75 72 72 65 6e    int bConcurren
1d6b0 74 20 3d 20 28 70 2d 3e 64 62 2d 3e 62 43 6f 6e  t = (p->db->bCon
1d6c0 63 75 72 72 65 6e 74 20 26 26 20 21 49 53 41 55  current && !ISAU
1d6d0 54 4f 56 41 43 55 55 4d 29 3b 0a 0a 20 20 73 71  TOVACUUM);..  sq
1d6e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1d6f0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1d700 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1d710 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
1d720 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
1d730 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
1d740 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
1d750 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
1d760 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
1d770 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1d780 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
1d790 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
1d7a0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1d7b0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1d7c0 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
1d7d0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
1d7e0 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
1d7f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
1d800 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
1d810 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1d820 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1d830 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
1d840 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
1d850 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
1d860 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
1d870 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
1d880 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
1d890 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
1d8a0 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
1d8b0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1d8c0 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
1d8d0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
1d8e0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1d8f0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
1d900 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
1d910 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d920 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1d930 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a   {.    sqlite3 *
1d940 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  pBlock = 0;.    
1d950 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
1d960 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
1d970 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
1d980 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
1d990 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  tion .    ** on 
1d9a0 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
1d9b0 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
1d9c0 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
1d9d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
1d9e0 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
1d9f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
1da00 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  CKED..    */.   
1da10 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
1da20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1da30 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
1da40 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  .     || (pBt->b
1da50 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
1da60 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b  NDING)!=0.    ){
1da70 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  .      pBlock = 
1da80 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1da90 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1daa0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
1dab0 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
1dac0 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72  .      for(pIter
1dad0 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
1dae0 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
1daf0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
1db00 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
1db10 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
1db20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
1db30 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
1db40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1db50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1db60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1db70 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  pBlock ){.      
1db80 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
1db90 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
1dba0 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  pBlock);.      r
1dbb0 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
1dbc0 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1dbd0 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f       goto trans_
1dbe0 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begun;.    }.  }
1dbf0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1dc00 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1dc10 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1dc20 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1dc30 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1dc40 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1dc50 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1dc60 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1dc70 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1dc80 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1dc90 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1dca0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1dcb0 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1dcc0 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1dcd0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1dce0 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1dcf0 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1dd00 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1dd10 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1dd20 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1dd30 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1dd40 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1dd50 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1dd60 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1dd70 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1dd80 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1dd90 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1dda0 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1ddb0 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1ddc0 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1ddd0 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1dde0 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1ddf0 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1de00 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1de10 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1de20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1de30 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1de40 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1de50 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1de60 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1de70 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1de80 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1de90 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1dea0 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1deb0 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1dec0 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1ded0 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1dee0 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1def0 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1df00 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1df10 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1df20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1df30 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1df40 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1df50 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1df60 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1df70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1df80 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1df90 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1dfa0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1dfb0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1dfc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1dfd0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1dfe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dff0 20 20 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20       int exFlag 
1e000 3d 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 3f 20  = bConcurrent ? 
1e010 2d 31 20 3a 20 28 77 72 66 6c 61 67 3e 31 29 3b  -1 : (wrflag>1);
1e020 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1e030 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1e040 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 65 78 46  pBt->pPager, exF
1e050 6c 61 67 2c 20 73 71 6c 69 74 65 33 54 65 6d 70  lag, sqlite3Temp
1e060 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
1e070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1e080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e090 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
1e0a0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1e0b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e0c0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1e0d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e0e0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
1e0f0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1e100 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
1e110 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
1e120 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
1e130 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1e140 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
1e150 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
1e160 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
1e170 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  (pBt) );.  sqlit
1e180 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b  e3PagerResetLock
1e190 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61  Timeout(pBt->pPa
1e1a0 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ger);..  if( rc=
1e1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e1c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1e1d0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1e1e0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1e1f0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
1e200 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1e210 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1e220 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
1e230 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1e240 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
1e250 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
1e260 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
1e270 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
1e280 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
1e290 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1e2a0 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
1e2b0 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
1e2c0 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
1e2d0 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
1e2e0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
1e2f0 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
1e300 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
1e310 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
1e320 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
1e330 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1e340 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
1e350 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1e360 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
1e370 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1e380 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1e390 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1e3a0 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1e3b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1e3c0 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1e3d0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1e3e0 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1e3f0 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1e400 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1e410 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1e420 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1e430 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1e440 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1e450 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1e460 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1e470 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1e480 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1e490 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1e4a0 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1e4b0 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1e4c0 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1e4d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e4e0 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1e4f0 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1e500 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1e510 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1e520 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1e530 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1e540 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1e550 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1e560 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1e570 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1e580 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1e590 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1e5a0 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1e5b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e5c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e5d0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1e5e0 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1e5f0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1e600 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1e610 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e620 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1e630 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1e640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e650 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1e660 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e670 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1e680 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e690 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1e6a0 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 23 69  .trans_begun:.#i
1e6b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e6c0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69  T_CONCURRENT.  i
1e6d0 66 28 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 26  f( bConcurrent &
1e6e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1e6f0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  && sqlite3PagerI
1e700 73 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  sWal(pBt->pPager
1e710 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
1e720 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 43  lite3PagerBeginC
1e730 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d 3e 70  oncurrent(pBt->p
1e740 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1e750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e760 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1e770 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61   rc = btreePtrma
1e780 70 41 6c 6c 6f 63 61 74 65 28 70 42 74 29 3b 0a  pAllocate(pBt);.
1e790 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1e7a0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1e7b0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1e7c0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1e7d0 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1e7e0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1e7f0 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1e800 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
1e810 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
1e820 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
1e830 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
1e840 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
1e850 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
1e860 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
1e870 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
1e880 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
1e890 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1e8a0 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
1e8b0 20 3d 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70   = p->db->nSavep
1e8c0 6f 69 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 73  oint;.    rc = s
1e8d0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1e8e0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1e8f0 61 67 65 72 2c 20 6e 53 61 76 65 70 6f 69 6e 74  ager, nSavepoint
1e900 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e910 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 53 61 76  QLITE_OK && nSav
1e920 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
1e930 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  rc = btreePtrmap
1e940 42 65 67 69 6e 28 70 42 74 2c 20 6e 53 61 76 65  Begin(pBt, nSave
1e950 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
1e960 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
1e970 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
1e980 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1e990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e9a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e9b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
1e9c0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
1e9d0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
1e9e0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
1e9f0 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
1ea00 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
1ea10 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
1ea20 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
1ea30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1ea40 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
1ea50 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
1ea60 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
1ea70 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
1ea80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1ea90 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
1eaa0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
1eab0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
1eae0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
1eaf0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
1eb20 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
1eb30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1eb60 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
1eb70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1eb80 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
1eb90 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
1eba0 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
1ebb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1ebc0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1ebd0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 70  tex) );.  rc = p
1ebe0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53  Page->isInit ? S
1ebf0 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65  QLITE_OK : btree
1ec00 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1ec10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ec20 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1ec30 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
1ec40 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
1ec50 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1ec60 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
1ec70 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1ec80 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
1ec90 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
1eca0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
1ecb0 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
1ecc0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1ecd0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1ece0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
1ecf0 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
1ed00 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1ed10 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1ed20 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1ed30 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
1ed40 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1ed50 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1ed60 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
1ed70 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1ed80 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1ed90 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
1eda0 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1edb0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1edc0 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20  o, &rc);.  }..  
1edd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ede0 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
1edf0 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
1ee00 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
1ee10 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
1ee20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
1ee30 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1ee40 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
1ee50 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
1ee60 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
1ee70 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
1ee80 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
1ee90 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
1eea0 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
1eeb0 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
1eec0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1eed0 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
1eee0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1eef0 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
1ef00 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1ef10 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
1ef20 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1ef30 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1ef40 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
1ef50 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
1ef60 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1ef70 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
1ef80 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
1ef90 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
1efa0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
1efb0 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
1efc0 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
1efd0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1efe0 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1f010 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
1f020 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
1f030 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
1f040 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
1f050 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
1f060 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
1f070 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f080 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1f090 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1f0a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f0b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
1f0c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1f0d0 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
1f0e0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1f0f0 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
1f100 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
1f110 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
1f120 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
1f130 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
1f140 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
1f150 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1f160 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1f170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f180 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
1f190 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  e);.    }.    pu
1f1a0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1f1b0 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
1f1c0 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  se{.    int i;. 
1f1d0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
1f1e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72    int rc;..    r
1f1f0 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  c = pPage->isIni
1f200 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  t ? SQLITE_OK : 
1f210 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1f220 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f230 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f240 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
1f250 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
1f260 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1f270 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
1f280 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1f290 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
1f2a0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1f2b0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
1f2c0 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
1f2d0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70   info;.        p
1f2e0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
1f2f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1f300 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
1f310 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69  f( info.nLocal<i
1f320 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a  nfo.nPayload ){.
1f330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1f340 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e  ell+info.nSize >
1f350 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50   pPage->aData+pP
1f360 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
1f370 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1f380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f390 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
1f3a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1f3b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1f3c0 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
1f3d0 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1f3e0 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  e-4) ){.        
1f3f0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1f400 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c  ll+info.nSize-4,
1f410 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1f420 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1f430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1f440 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f450 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1f460 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1f470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1f480 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1f490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1f4a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1f4b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1f4c0 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1f4d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1f4e0 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1f4f0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1f500 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1f510 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1f520 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1f530 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1f540 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f550 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
1f560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
1f570 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1f580 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1f590 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
1f5a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f5b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f5c0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1f5d0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
1f5e0 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
1f5f0 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
1f600 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
1f610 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
1f620 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
1f630 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  ains valid..**.*
1f640 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  * The isCommit f
1f650 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
1f660 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  at there is no n
1f670 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1f680 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  that.** the jour
1f690 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
1f6a0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
1f6b0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1f6c0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20  bPage->pgno .** 
1f6d0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
1f6e0 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
1f6f0 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
1f700 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
1f710 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e  to that.** page.
1f720 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1f730 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
1f740 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
1f750 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1f760 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
1f770 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
1f780 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
1f790 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
1f7a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f7b0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1f7c0 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
1f7d0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1f7e0 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
1f7f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1f800 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
1f810 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1f820 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
1f830 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
1f840 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
1f850 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
1f860 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
1f870 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1f880 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c    /* isCommit fl
1f890 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ag passed to sql
1f8a0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1f8b0 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
1f8c0 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
1f8d0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
1f8e0 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
1f8f0 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
1f900 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
1f910 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
1f920 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f930 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1f940 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1f950 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
1f960 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
1f970 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1f980 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
1f990 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
1f9a0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1f9b0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1f9c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1f9d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1f9e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1f9f0 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
1fa00 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
1fa10 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
1fa20 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
1fa30 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
1fa40 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
1fa50 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
1fa60 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
1fa70 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
1fa80 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
1fa90 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
1faa0 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
1fab0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1fac0 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
1fad0 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
1fae0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
1faf0 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
1fb00 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
1fb10 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
1fb20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fb30 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1fb40 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
1fb50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
1fb60 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
1fb70 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
1fb80 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
1fb90 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
1fba0 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
1fbb0 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
1fbc0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1fbd0 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
1fbe0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
1fbf0 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
1fc00 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
1fc10 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
1fc20 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
1fc30 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
1fc40 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
1fc50 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
1fc60 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
1fc70 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
1fc80 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1fc90 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
1fca0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
1fcb0 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
1fcc0 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
1fcd0 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
1fce0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1fcf0 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
1fd00 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1fd10 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1fd20 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1fd30 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
1fd40 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
1fd50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1fd60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fd70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1fd80 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
1fd90 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
1fda0 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
1fdb0 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
1fdc0 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
1fdd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  !=0 ){.      ptr
1fde0 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
1fdf0 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
1fe00 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
1fe10 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  e, &rc);.      i
1fe20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fe30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1fe40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1fe50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1fe60 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
1fe70 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
1fe80 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
1fe90 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
1fea0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
1feb0 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
1fec0 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
1fed0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1fee0 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
1fef0 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
1ff00 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1ff10 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1ff20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1ff30 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
1ff40 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
1ff50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ff60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ff70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ff80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ff90 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
1ffa0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1ffb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ffc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ffd0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1ffe0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
1fff0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20000 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
20010 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
20020 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
20030 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
20040 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
20050 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
20060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20070 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
20080 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
20090 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
200a0 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  e, &rc);.    }. 
200b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
200c0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
200d0 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
200e0 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
200f0 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
20100 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
20110 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
20120 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
20130 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
20140 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
20150 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
20160 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
20170 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
20180 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
20190 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
201a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
201b0 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
201c0 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
201d0 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
201e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
201f0 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
20200 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
20210 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
20220 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
20230 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
20240 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
20250 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
20260 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
20270 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
20280 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
20290 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
202a0 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
202b0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
202c0 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
202d0 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
202e0 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
202f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
20300 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
20310 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
20320 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
20330 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
20340 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
20350 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
20360 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
20370 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
20380 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
20390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
203a0 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
203b0 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
203c0 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
203d0 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
203e0 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
203f0 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
20400 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
20410 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
20420 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
20430 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a  uum-on-commit .*
20440 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
20450 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
20460 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
20470 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
20480 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
20490 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
204a0 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
204b0 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
204c0 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
204d0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
204e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
204f0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
20500 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
20510 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
20520 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20530 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
20540 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
20550 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
20560 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
20570 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
20580 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
20590 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
205a0 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
205b0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
205c0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
205d0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
205e0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
205f0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
20600 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
20610 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
20620 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
20630 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
20640 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
20650 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
20660 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
20670 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20680 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20690 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
206a0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
206b0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
206c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
206d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
206e0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
206f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
20700 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
20710 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
20720 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
20730 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
20740 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
20750 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
20760 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
20770 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
20780 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
20790 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
207a0 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
207b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
207c0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
207d0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
207e0 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
207f0 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
20800 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
20810 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
20820 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
20830 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
20840 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
20850 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
20860 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
20870 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
20880 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
20890 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
208a0 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
208b0 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
208c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
208d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
208e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
208f0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
20900 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
20910 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
20920 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
20930 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
20940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
20950 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
20960 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
20970 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
20980 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
20990 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
209a0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
209b0 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
209c0 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
209d0 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
209e0 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
209f0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
20a00 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
20a10 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
20a20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
20a30 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
20a40 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
20a50 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
20a60 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
20a70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
20a80 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
20a90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20aa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
20ab0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
20ac0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
20ad0 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
20ae0 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
20af0 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
20b00 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
20b10 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
20b20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
20b30 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
20b40 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
20b50 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
20b60 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
20b70 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
20b80 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
20b90 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
20ba0 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
20bb0 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
20bc0 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
20bd0 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
20be0 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
20bf0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
20c00 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
20c10 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
20c20 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
20c30 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
20c40 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
20c50 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
20c60 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
20c70 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
20c80 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
20c90 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
20ca0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
20cb0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
20cc0 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
20cd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
20ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20cf0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
20d00 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
20d10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
20d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20d30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20d40 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
20d50 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
20d60 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
20d70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20d80 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
20d90 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
20da0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
20db0 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
20dc0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
20dd0 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
20de0 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
20df0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
20e00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20e10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20e30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20e40 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
20e50 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
20e60 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
20e70 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
20e80 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
20e90 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
20ea0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
20eb0 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
20ec0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
20ed0 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
20ee0 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
20ef0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
20f00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20f10 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
20f20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
20f30 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
20f40 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
20f50 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
20f60 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
20f70 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
20f80 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
20f90 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
20fa0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
20fb0 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
20fc0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
20fd0 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
20fe0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
20ff0 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
21000 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
21010 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
21020 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
21030 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
21040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21050 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
21060 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
21070 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
21080 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
21090 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
210a0 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
210b0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
210c0 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
210f0 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
21100 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
21110 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
21120 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
21130 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
21140 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
21150 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
21160 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
21170 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
21180 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
21190 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
211a0 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
211b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
211c0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
211d0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
211e0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
211f0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
21200 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21210 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
21220 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
21230 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
21240 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
21250 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
21260 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
21270 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
21280 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
21290 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
212a0 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
212b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
212c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
212d0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
212e0 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
212f0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
21300 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
21310 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
21320 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
21330 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
21340 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
21350 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
21360 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
21370 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
21380 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
21390 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
213a0 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
213b0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
213c0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
213d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
213e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
213f0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
21400 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21410 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
21420 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
21430 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
21440 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
21450 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
21460 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
21470 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
21480 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
21490 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
214a0 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
214b0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
214c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
214d0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
214e0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
214f0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
21500 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
21510 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
21520 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
21530 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
21540 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
21550 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
21560 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
21570 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
21580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21590 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
215a0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
215b0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
215c0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
215d0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
215e0 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
215f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
21600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21610 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21620 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
21630 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
21640 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
21650 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
21660 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
21670 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
21680 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
21690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
216a0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
216b0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
216c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
216d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
216e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
216f0 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
21700 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
21710 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
21720 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
21730 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
21740 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
21750 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
21760 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21770 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
21780 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
21790 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
217a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
217b0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
217c0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
217d0 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
217e0 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
217f0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
21800 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
21810 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
21820 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
21830 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
21840 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
21850 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
21860 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
21870 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
21880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
21890 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
218a0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
218b0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
218c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
218d0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29  count(pPager); )
218e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
218f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
21900 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
21910 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
21920 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
21930 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
21940 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
21950 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
21960 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
21970 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
21980 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
21990 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
219a0 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
219b0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
219c0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
219d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
219e0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
219f0 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
21a00 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
21a10 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
21a20 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
21a30 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
21a40 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
21a50 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
21a60 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
21a70 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
21a80 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
21a90 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
21aa0 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
21ab0 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
21ac0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
21ad0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
21ae0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
21af0 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
21b00 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
21b10 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
21b20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
21b30 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
21b40 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
21b50 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
21b60 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
21b70 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
21b80 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
21b90 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
21ba0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21bb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21bc0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
21bd0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
21be0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
21bf0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
21c00 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
21c10 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
21c20 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
21c30 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
21c40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21c50 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
21c60 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
21c70 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
21c80 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
21c90 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
21ca0 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
21cb0 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
21cc0 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
21cd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
21ce0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
21cf0 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
21d00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
21d10 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
21d20 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
21d30 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
21d40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21d50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
21d60 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
21d70 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
21d80 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
21d90 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
21da0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
21db0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
21dc0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
21dd0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
21de0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
21df0 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
21e00 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
21e10 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
21e20 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
21e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21e40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
21e60 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
21e70 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
21e80 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
21e90 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
21ea0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
21eb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21ec0 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
21ed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
21ee0 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
21ef0 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
21f00 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
21f10 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
21f20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
21f30 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69  URRENT./*.** Thi
21f40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21f50 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
21f60 6d 65 72 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55  merging an CONCU
21f70 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
21f80 6e 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e  n with.** the sn
21f90 61 70 73 68 6f 74 20 61 74 20 74 68 65 20 68 65  apshot at the he
21fa0 61 64 20 6f 66 20 74 68 65 20 77 61 6c 20 66 69  ad of the wal fi
21fb0 6c 65 2e 20 49 74 20 72 65 6c 6f 63 61 74 65 73  le. It relocates
21fc0 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
21fd0 65 0a 2a 2a 20 72 61 6e 67 65 20 69 46 69 72 73  e.** range iFirs
21fe0 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73  t..iLast, inclus
21ff0 69 76 65 2e 20 49 74 20 69 73 20 61 73 73 75 6d  ive. It is assum
22000 65 64 20 74 68 61 74 20 74 68 65 20 42 74 72 65  ed that the Btre
22010 65 50 74 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75  ePtrmap .** stru
22020 63 74 75 72 65 20 61 74 20 42 74 53 68 61 72 65  cture at BtShare
22030 64 2e 70 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20  d.pMap contains 
22040 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
22050 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  the pointers to 
22060 65 61 63 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20  each.** page in 
22070 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a  the range..**.**
22080 20 49 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73   If pnCurrent is
22090 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20   NULL, then all 
220a0 70 61 67 65 73 20 69 6e 20 74 68 65 20 72 61 6e  pages in the ran
220b0 67 65 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ge are moved to 
220c0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65  currently.** fre
220d0 65 20 6c 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65  e locations (i.e
220e0 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72  . free-list entr
220f0 69 65 73 29 20 77 69 74 68 69 6e 20 74 68 65 20  ies) within the 
22100 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
22110 66 6f 72 65 20 70 61 67 65 0a 2a 2a 20 69 46 69  fore page.** iFi
22120 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  rst..**.** Or, i
22130 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 6e  f pnCurrent is n
22140 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
22150 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
22160 75 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ue containing th
22170 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 69 7a  e.** current siz
22180 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
22190 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
221a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
221b0 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
221c0 72 65 6c 6f 63 61 74 65 64 20 74 6f 20 74 68 65  relocated to the
221d0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
221e0 62 61 73 65 20 66 69 6c 65 20 2d 20 70 61 67 65  base file - page
221f0 20 69 46 69 72 73 74 20 69 73 20 72 65 6c 6f 63   iFirst is reloc
22200 61 74 65 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20  ated to.** page 
22210 28 2a 70 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20  (*pnCurrent+1), 
22220 70 61 67 65 20 69 46 69 72 73 74 2b 31 20 74 6f  page iFirst+1 to
22230 20 70 61 67 65 20 28 2a 70 6e 43 75 72 72 65 6e   page (*pnCurren
22240 74 2b 32 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e  t+2), and so on.
22250 0a 2a 2a 20 56 61 6c 75 65 20 2a 70 6e 43 75 72  .** Value *pnCur
22260 72 65 6e 74 20 69 73 20 73 65 74 20 74 6f 20 74  rent is set to t
22270 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74  he new size of t
22280 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
22290 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
222a0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
222b0 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
222c0 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
222d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
222e0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
222f0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
22300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
22310 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65  reeRelocateRange
22320 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
22330 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
22340 20 20 20 20 2f 2a 20 42 2d 74 72 65 65 20 68 61      /* B-tree ha
22350 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ndle */.  Pgno i
22360 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
22370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
22380 73 74 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63  st page to reloc
22390 61 74 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c  ate */.  Pgno iL
223a0 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
223b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
223c0 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74   page to relocat
223d0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43  e */.  Pgno *pnC
223e0 75 72 72 65 6e 74 20 20 20 20 20 20 20 20 20 20  urrent          
223f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
22400 20 4e 55 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44   NULL, IN/OUT: D
22410 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
22420 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
22430 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
22440 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
22450 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f  Bt->pMap;.  Pgno
22460 20 69 50 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67   iPg;..  for(iPg
22470 3d 69 46 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c  =iFirst; iPg<=iL
22480 61 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ast && rc==SQLIT
22490 45 5f 4f 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  E_OK; iPg++){.  
224a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
224b0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 61 67   = 0;     /* Pag
224c0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d  e allocated from
224d0 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20   free-list */.  
224e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
224f0 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   0;.    Pgno iNe
22500 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
22510 2f 2a 20 4e 65 77 20 70 61 67 65 20 6e 75 6d 62  /* New page numb
22520 65 72 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20  er for pPg */.  
22530 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70    PtrmapEntry *p
22540 45 6e 74 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69  Entry;    /* Poi
22550 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
22560 6f 72 20 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a  or page iPg */..
22570 20 20 20 20 69 66 28 20 69 50 67 3d 3d 50 45 4e      if( iPg==PEN
22580 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
22590 42 74 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Bt) ) continue;.
225a0 20 20 20 20 70 45 6e 74 72 79 20 3d 20 26 70 4d      pEntry = &pM
225b0 61 70 2d 3e 61 50 74 72 5b 69 50 67 20 2d 20 70  ap->aPtr[iPg - p
225c0 4d 61 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20  Map->iFirst];.. 
225d0 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 65     if( pEntry->e
225e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
225f0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 50  EPAGE ){.      P
22600 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  gno dummy;.     
22610 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
22620 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
22630 72 65 65 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67  ree, &dummy, iPg
22640 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
22650 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
22660 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
22670 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
22680 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 46  rPageRefcount(pF
22690 72 65 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 31  ree->pDbPage)==1
226a0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
226b0 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 46  te3PcacheDrop(pF
226c0 72 65 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ree->pDbPage);. 
226d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
226e0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
226f0 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67  OK || dummy==iPg
22700 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
22710 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20  ( pnCurrent ){. 
22720 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61 67       btreeGetPag
22730 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67  e(pBt, iPg, &pPg
22740 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
22750 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
22760 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 67 2d  Iswriteable(pPg-
22770 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
22780 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
22790 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
227a0 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61 67 65  unt(pPg->pDbPage
227b0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 4e  )==1 );.      iN
227c0 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
227d0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  nt);.      if( i
227e0 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  New==PENDING_BYT
227f0 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 69 4e  E_PAGE(pBt) ) iN
22800 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
22810 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
22820 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
22830 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65  , pPg, pEntry->e
22840 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61  Type, pEntry->pa
22850 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a  rent, iNew, 1);.
22860 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
22870 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  eNotNull(pPg);. 
22880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22890 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
228a0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
228b0 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69 72 73  ee, &iNew, iFirs
228c0 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29  t-1, BTALLOC_LE)
228d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
228e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
228f0 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29 3b 0a   iNew<iFirst );.
22900 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22920 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22930 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Free);.        b
22940 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22950 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a   iPg, &pPg, 0);.
22960 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
22970 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
22980 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  Pg, pEntry->eTyp
22990 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e  e, pEntry->paren
229a0 74 2c 69 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20  t,iNew,1);.     
229b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
229c0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
229d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
229e0 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e  rc;.}../* !defin
229f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
22a00 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
22a10 20 54 68 65 20 62 2d 74 72 65 65 20 68 61 6e 64   The b-tree hand
22a20 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
22a30 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69   only argument i
22a40 73 20 61 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69  s about to commi
22a50 74 20 61 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45  t an.** CONCURRE
22a60 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  NT transaction. 
22a70 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
22a80 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22a90 68 61 74 20 74 68 69 73 20 69 73 20 0a 2a 2a 20  hat this is .** 
22aa0 70 6f 73 73 69 62 6c 65 20 2d 20 74 68 65 20 77  possible - the w
22ab0 61 6c 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 69  al WRITER lock i
22ac0 73 20 68 65 6c 64 20 61 6e 64 20 69 74 20 69 73  s held and it is
22ad0 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 72   known that ther
22ae0 65 20 61 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e  e are .** no con
22af0 66 6c 69 63 74 73 20 77 69 74 68 20 63 6f 6d 6d  flicts with comm
22b00 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
22b10 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
22b20 74 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b  t btreeFixUnlock
22b30 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
22b40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22b50 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
22b60 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
22b70 3e 70 50 61 67 65 31 3b 0a 20 20 75 38 20 2a 70  >pPage1;.  u8 *p
22b80 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
22b90 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
22ba0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
22bb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22bc0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
22bd0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
22be0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 77  atabase is not w
22bf0 72 69 74 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f  ritable, then no
22c00 20 70 61 67 65 73 20 77 65 72 65 20 61 6c 6c 6f   pages were allo
22c10 63 61 74 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72  cated.  ** or fr
22c20 65 65 64 20 62 79 20 74 68 69 73 20 74 72 61 6e  eed by this tran
22c30 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
22c40 20 63 61 73 65 20 6e 6f 20 73 70 65 63 69 61 6c   case no special
22c50 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20   handling is .  
22c60 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  ** required. Oth
22c70 65 72 77 69 73 65 2c 20 69 66 20 70 61 67 65 20  erwise, if page 
22c80 31 20 69 73 20 64 69 72 74 79 2c 20 70 72 6f 63  1 is dirty, proc
22c90 65 65 64 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65  eed.  */.  Btree
22ca0 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
22cb0 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f  Bt->pMap;.  Pgno
22cc0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
22cd0 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50  te(&p1[32]);.  P
22ce0 67 6e 6f 20 6e 50 61 67 65 20 3d 20 62 74 72 65  gno nPage = btre
22cf0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
22d00 0a 20 20 75 33 32 20 6e 46 72 65 65 20 3d 20 67  .  u32 nFree = g
22d10 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29  et4byte(&p1[36])
22d20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
22d30 2d 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d  ->pMap );.  rc =
22d40 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 70 67   sqlite3PagerUpg
22d50 72 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50 61  radeSnapshot(pPa
22d60 67 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44 62  ger, pPage1->pDb
22d70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
22d80 20 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61   p1==pPage1->aDa
22d90 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ta );..  if( rc=
22da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22db0 20 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20    Pgno nHPage = 
22dc0 67 65 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d  get4byte(&p1[28]
22dd0 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
22de0 20 3d 20 6e 48 50 61 67 65 3b 20 20 20 20 20 20   = nHPage;      
22df0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
22e00 20 61 66 74 65 72 20 74 72 61 6e 73 61 63 74 69   after transacti
22e10 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20  on merge */..   
22e20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
22e30 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
22e40 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 7b  ge1->pDbPage) ){
22e50 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 48 54 72  .      Pgno iHTr
22e60 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
22e70 70 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 75  p1[32]);.      u
22e80 33 32 20 6e 48 46 72 65 65 20 3d 20 67 65 74 34  32 nHFree = get4
22e90 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a  byte(&p1[36]);..
22ea0 20 20 20 20 20 20 62 74 72 65 65 50 74 72 6d 61        btreePtrma
22eb0 70 43 68 65 63 6b 28 70 42 74 2c 20 6e 50 61 67  pCheck(pBt, nPag
22ec0 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74  e);..      /* At
22ed0 74 61 63 68 20 74 68 65 20 68 65 61 64 20 64 61  tach the head da
22ee0 74 61 62 61 73 65 20 66 72 65 65 20 6c 69 73 74  tabase free list
22ef0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
22f00 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
22f10 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
22f20 20 66 72 65 65 2d 6c 69 73 74 20 28 69 66 20 61   free-list (if a
22f30 6e 79 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ny).  */.      i
22f40 66 28 20 69 54 72 75 6e 6b 21 3d 30 20 29 7b 0a  f( iTrunk!=0 ){.
22f50 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
22f60 28 26 70 31 5b 33 36 5d 2c 20 6e 48 46 72 65 65  (&p1[36], nHFree
22f70 20 2b 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 20   + nFree);.     
22f80 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b     put4byte(&p1[
22f90 33 32 5d 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  32], iTrunk);.  
22fa0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 54 72        while( iTr
22fb0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
22fc0 20 44 62 50 61 67 65 20 2a 70 54 72 75 6e 6b 20   DbPage *pTrunk 
22fd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
22fe0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 54 72  okup(pPager, iTr
22ff0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
23000 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
23010 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70  e((u8*)pTrunk->p
23020 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  Data);.         
23030 20 69 66 28 20 69 54 72 75 6e 6b 3d 3d 30 20 29   if( iTrunk==0 )
23040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
23050 74 34 62 79 74 65 28 28 75 38 2a 29 70 54 72 75  t4byte((u8*)pTru
23060 6e 6b 2d 3e 70 44 61 74 61 2c 20 69 48 54 72 75  nk->pData, iHTru
23070 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
23080 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23090 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 72  e3PagerUnref(pTr
230a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 3b  unk);.        };
230b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
230c0 69 66 28 20 6e 48 50 61 67 65 3c 28 70 4d 61 70  if( nHPage<(pMap
230d0 2d 3e 69 46 69 72 73 74 2d 31 29 20 29 7b 0a 20  ->iFirst-1) ){. 
230e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
230f0 74 61 62 61 73 65 20 63 6f 6e 73 69 73 74 65 64  tabase consisted
23100 20 6f 66 20 28 70 4d 61 70 2d 3e 69 46 69 72 73   of (pMap->iFirs
23110 74 2d 31 29 20 70 61 67 65 73 20 77 68 65 6e 20  t-1) pages when 
23120 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
23130 20 20 20 20 2a 2a 20 63 6f 6e 63 75 72 72 65 6e      ** concurren
23140 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
23150 73 20 6f 70 65 6e 65 64 2e 20 41 6e 64 20 61 6e  s opened. And an
23160 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
23170 73 61 63 74 69 6f 6e 20 6d 61 79 0a 20 20 20 20  saction may.    
23180 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 65 78      ** not be ex
23190 65 63 75 74 65 64 20 6f 6e 20 61 6e 20 61 75 74  ecuted on an aut
231a0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
231b0 65 20 2d 20 73 6f 20 74 68 65 20 64 62 20 73 68  e - so the db sh
231c0 6f 75 6c 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  ould .        **
231d0 20 6e 6f 74 20 68 61 76 65 20 73 68 72 75 6e 6b   not have shrunk
231e0 20 73 69 6e 63 65 20 74 68 65 20 74 72 61 6e 73   since the trans
231f0 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
23200 64 2e 20 54 68 65 72 65 66 6f 72 65 20 6e 48 50  d. Therefore nHP
23210 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  age.        ** s
23220 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  hould be set to 
23230 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29  (pMap->iFirst-1)
23240 20 6f 72 20 67 72 65 61 74 65 72 2e 20 2a 2f 0a   or greater. */.
23250 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23260 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23280 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
23290 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
232a0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  n allocated page
232b0 73 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 74  s pMap->iFirst t
232c0 68 72 6f 75 67 68 0a 20 20 20 20 20 20 20 20 2a  hrough.        *
232d0 2a 20 6e 50 61 67 65 20 28 69 6e 63 6c 75 73 69  * nPage (inclusi
232e0 76 65 29 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ve) at the end o
232f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
23300 69 6c 65 2e 20 4d 65 61 6e 77 68 69 6c 65 2c 0a  ile. Meanwhile,.
23310 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
23320 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 68 61   transactions ha
23330 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 46  ve allocated (iF
23340 69 72 73 74 2e 2e 6e 48 50 61 67 65 29 2e 20 53  irst..nHPage). S
23350 6f 20 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  o move.        *
23360 2a 20 70 61 67 65 73 20 28 69 46 69 72 73 74 2e  * pages (iFirst.
23370 2e 4d 49 4e 28 6e 50 61 67 65 2c 6e 48 50 61 67  .MIN(nPage,nHPag
23380 65 29 29 20 74 6f 20 28 4d 41 58 28 6e 50 61 67  e)) to (MAX(nPag
23390 65 2c 6e 48 50 61 67 65 29 2b 31 29 2e 20 2a 2f  e,nHPage)+1). */
233a0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4c  .        Pgno iL
233b0 61 73 74 20 3d 20 4d 49 4e 28 6e 50 61 67 65 2c  ast = MIN(nPage,
233c0 20 6e 48 50 61 67 65 29 3b 20 20 20 20 2f 2a 20   nHPage);    /* 
233d0 4c 61 73 74 20 70 61 67 65 20 74 6f 20 6d 6f 76  Last page to mov
233e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e  e */.        Pgn
233f0 6f 20 6e 43 75 72 72 65 6e 74 3b 20 20 20 20 20  o nCurrent;     
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
23420 20 6f 66 20 64 62 20 2a 2f 0a 0a 20 20 20 20 20   of db */..     
23430 20 20 20 6e 43 75 72 72 65 6e 74 20 3d 20 4d 41     nCurrent = MA
23440 58 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29  X(nPage, nHPage)
23450 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  ;.        pBt->n
23460 50 61 67 65 20 3d 20 6e 43 75 72 72 65 6e 74 3b  Page = nCurrent;
23470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
23480 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65  reeRelocateRange
23490 28 70 42 74 2c 20 70 4d 61 70 2d 3e 69 46 69 72  (pBt, pMap->iFir
234a0 73 74 2c 20 69 4c 61 73 74 2c 20 26 6e 43 75 72  st, iLast, &nCur
234b0 72 65 6e 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  rent);..        
234c0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 77  /* There are now
234d0 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77   no collisions w
234e0 69 74 68 20 74 68 65 20 73 6e 61 70 73 68 6f 74  ith the snapshot
234f0 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 20   at the head of 
23500 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
23510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
23520 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
23530 74 20 77 6f 75 6c 64 20 62 65 20 70 6f 73 73 69  t would be possi
23540 62 6c 65 20 74 6f 20 77 72 69 74 65 0a 20 20 20  ble to write.   
23550 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e       ** the tran
23560 73 61 63 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  saction out to d
23570 69 73 6b 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  isk. Before doin
23580 67 20 73 6f 20 74 68 6f 75 67 68 2c 20 61 74 74  g so though, att
23590 65 6d 70 74 20 74 6f 0a 20 20 20 20 20 20 20 20  empt to.        
235a0 2a 2a 20 72 65 6c 6f 63 61 74 65 20 73 6f 6d 65  ** relocate some
235b0 20 6f 66 20 74 68 65 20 6e 65 77 20 70 61 67 65   of the new page
235c0 73 20 74 6f 20 66 72 65 65 20 6c 6f 63 61 74 69  s to free locati
235d0 6f 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20 62  ons within the b
235e0 6f 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ody.        ** o
235f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
23600 69 6c 65 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c  ile (i.e. free-l
23610 69 73 74 20 65 6e 74 72 69 65 73 29 2e 20 2a 2f  ist entries). */
23620 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
23630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23650 6e 43 75 72 72 65 6e 74 21 3d 50 45 4e 44 49 4e  nCurrent!=PENDIN
23660 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
23670 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
23680 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73  lite3PagerSetDbs
23690 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
236a0 20 6e 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20   nCurrent);.    
236b0 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65        nFree = ge
236c0 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b  t4byte(&p1[36]);
236d0 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 20  .          nFin 
236e0 3d 20 6e 43 75 72 72 65 6e 74 2d 6e 46 72 65 65  = nCurrent-nFree
236f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23700 6e 43 75 72 72 65 6e 74 3e 50 45 4e 44 49 4e 47  nCurrent>PENDING
23710 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
23720 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47  && nFin<=PENDING
23730 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
23740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
23750 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Fin--;.         
23760 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69   }.          nFi
23770 6e 20 3d 20 4d 41 58 28 6e 46 69 6e 2c 20 6e 48  n = MAX(nFin, nH
23780 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
23790 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f 63   rc = btreeReloc
237a0 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 6e 46  ateRange(pBt, nF
237b0 69 6e 2b 31 2c 20 6e 43 75 72 72 65 6e 74 2c 20  in+1, nCurrent, 
237c0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  0);.        }.. 
237d0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
237e0 26 70 31 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  &p1[28], nFin);.
237f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23800 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
23810 74 44 62 73 69 7a 65 28 70 50 61 67 65 72 2c 20  tDbsize(pPager, 
23820 6e 46 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  nFin);.  }..  re
23830 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
23840 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 46  .# define btreeF
23850 69 78 55 6e 6c 6f 63 6b 65 64 28 58 29 20 20 53  ixUnlocked(X)  S
23860 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20  QLITE_OK.#endif 
23870 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
23880 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a  ONCURRENT */../*
23890 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
238a0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
238b0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
238c0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
238d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
238e0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
238f0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
23900 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
23910 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
23920 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
23930 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
23940 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
23950 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
23960 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
23970 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
23980 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
23990 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
239a0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
239b0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
239c0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
239d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
239e0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
239f0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
23a00 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
23a10 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
23a20 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
23a30 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
23a40 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
23a50 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
23a60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
23a70 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
23a80 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
23a90 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
23aa0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
23ab0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
23ac0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
23ad0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
23ae0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
23af0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
23b00 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
23b10 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
23b20 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
23b30 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
23b40 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
23b50 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
23b60 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
23b70 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
23b80 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
23b90 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23ba0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
23bb0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
23bc0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
23bd0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
23be0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
23bf0 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
23c00 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
23c10 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
23c20 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
23c30 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
23c40 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
23c50 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
23c60 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
23c70 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
23c80 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
23c90 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
23ca0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
23cb0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
23cc0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
23cd0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
23ce0 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
23cf0 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
23d00 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
23d10 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
23d20 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
23d30 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
23d40 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
23d50 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
23d60 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
23d70 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
23d80 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
23d90 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
23da0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
23db0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
23dc0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
23dd0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
23de0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23df0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
23e00 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
23e10 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
23e20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23e30 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
23e40 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
23e50 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
23e60 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
23e70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
23e80 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66  eeEnter(p);..#if
23e90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23ea0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
23eb0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
23ec0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 61 73 73  uum ){.      ass
23ed0 65 72 74 28 20 49 53 43 4f 4e 43 55 52 52 45 4e  ert( ISCONCURREN
23ee0 54 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  T==0 );.      rc
23ef0 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
23f00 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
23f10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23f20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
23f30 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
23f40 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
23f50 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
23f60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
23f70 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
23f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
23f90 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
23fa0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
23fb0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
23fc0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
23fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23fe0 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 7b 0a  ISCONCURRENT ){.
23ff0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
24000 46 69 78 55 6e 6c 6f 63 6b 65 64 28 70 29 3b 0a  FixUnlocked(p);.
24010 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
24020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24030 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24040 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
24050 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
24060 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
24070 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24080 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
24090 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
240a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
240b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
240c0 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
240d0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
240e0 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
240f0 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
24100 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
24110 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
24120 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
24130 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
24140 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
24150 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24160 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
24170 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
24180 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
24190 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
241a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
241b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
241c0 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
241d0 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
241e0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
241f0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
24200 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
24210 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
24220 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
24230 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
24240 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
24250 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
24260 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
24270 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
24280 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
24290 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
242a0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
242b0 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
242c0 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
242d0 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
242e0 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
242f0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
24300 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
24310 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
24320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
24330 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
24340 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
24350 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
24360 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
24370 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
24380 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
24390 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
243a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
243b0 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
243c0 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
243d0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
243e0 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
243f0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
24400 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
24410 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
24420 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
24430 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
24440 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
24450 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
24460 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
24470 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
24480 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
24490 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
244a0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
244b0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
244c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
244d0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
244e0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
244f0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
24500 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
24510 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
24520 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
24530 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
24540 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
24550 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
24560 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
24570 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
24580 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
24590 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
245a0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
245b0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
245c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
245d0 77 61 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e  was an CONCURREN
245e0 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  T transaction, d
245f0 65 6c 65 74 65 20 74 68 65 20 70 42 74 2d 3e 70  elete the pBt->p
24600 4d 61 70 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  Map object..  **
24610 20 41 6c 73 6f 20 63 61 6c 6c 20 50 61 67 65 72   Also call Pager
24620 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 29 20  EndConcurrent() 
24630 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
24640 68 65 20 70 61 67 65 72 20 68 61 73 20 64 69 73  he pager has dis
24650 63 61 72 64 65 64 0a 20 20 2a 2a 20 74 68 65 20  carded.  ** the 
24660 72 65 63 6f 72 64 20 6f 66 20 61 6c 6c 20 70 61  record of all pa
24670 67 65 73 20 72 65 61 64 20 77 69 74 68 69 6e 20  ges read within 
24680 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
24690 20 20 2a 2f 0a 20 20 62 74 72 65 65 50 74 72 6d    */.  btreePtrm
246a0 61 70 44 65 6c 65 74 65 28 70 42 74 29 3b 0a 20  apDelete(pBt);. 
246b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e 64   sqlite3PagerEnd
246c0 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d 3e  Concurrent(pBt->
246d0 70 50 61 67 65 72 29 3b 0a 20 20 62 74 72 65 65  pPager);.  btree
246e0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
246f0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
24700 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
24710 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
24720 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
24730 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
24740 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
24750 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
24760 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
24770 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
24780 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
24790 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
247a0 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
247b0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
247c0 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
247d0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
247e0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
247f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
24800 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
24810 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
24820 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
24830 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
24840 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
24850 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
24860 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
24870 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
24880 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
24890 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
248a0 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
248b0 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
248c0 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
248d0 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
248e0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
248f0 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
24900 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
24910 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
24920 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
24930 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
24940 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
24950 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
24960 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
24970 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
24980 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
24990 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
249a0 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
249b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
249c0 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
249d0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
249e0 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
249f0 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
24a00 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
24a10 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
24a20 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
24a30 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
24a40 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
24a50 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
24a60 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
24a70 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
24a80 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
24a90 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
24aa0 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
24ab0 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
24ac0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
24ad0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
24ae0 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
24af0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
24b00 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
24b10 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
24b20 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
24b30 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
24b40 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
24b50 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
24b60 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
24b70 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
24b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
24b90 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
24ba0 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
24bb0 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
24bc0 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
24bd0 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
24be0 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
24bf0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
24c00 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
24c10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
24c20 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
24c30 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
24c40 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
24c50 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
24c60 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
24c70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24c80 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
24c90 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
24ca0 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
24cb0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
24cc0 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
24cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
24ce0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
24cf0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
24d00 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
24d10 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
24d20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
24d30 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
24d40 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
24d50 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
24d60 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
24d70 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
24d80 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
24d90 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
24da0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
24db0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
24dc0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
24dd0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
24de0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
24df0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
24e00 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
24e10 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
24e20 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
24e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24e40 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
24e50 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
24e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24e70 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
24e80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
24e90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
24ea0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24eb0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rc;.    }.    p-
24ec0 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b  >iDataVersion--;
24ed0 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20    /* Compensate 
24ee0 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74  for pPager->iDat
24ef0 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20  aVersion++; */. 
24f00 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
24f10 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
24f20 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
24f30 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
24f40 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
24f50 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
24f60 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
24f70 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
24f80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24f90 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
24fa0 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
24fb0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
24fc0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
24fd0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
24fe0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
24ff0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
25000 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
25010 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
25020 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
25040 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
25050 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
25060 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
25070 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
25080 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25090 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
250a0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
250b0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
250c0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
250d0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
250e0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
250f0 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68  rsor on any BtSh
25100 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
25110 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20  .** references. 
25120 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65   Or if the write
25130 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74  Only flag is set
25140 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79   to 1, then only
25150 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63  .** trip write c
25160 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65  ursors and leave
25170 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e   read cursors un
25180 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
25190 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61  very cursor is a
251a0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
251b0 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
251c0 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74  ing cursors.** t
251d0 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74  hat belong to ot
251e0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
251f0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
25200 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68  ppen to be.** sh
25210 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20  aring the cache 
25220 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
25230 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25240 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
25250 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
25260 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65  rs. If the write
25270 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Only.** flag is 
25280 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  true, then only 
25290 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65  write-cursors ne
252a0 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20  ed be tripped - 
252b0 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72  read-only.** cur
252c0 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20  sors save their 
252d0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
252e0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d  s so that they m
252f0 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20  ay continue .** 
25300 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f  following the ro
25310 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77  llback. Or, if w
25320 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
25330 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  e, all cursors a
25340 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20  re .** tripped. 
25350 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74  In general, writ
25360 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69  eOnly is false i
25370 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
25380 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65  n being.** rolle
25390 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20  d back modified 
253a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
253b0 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ema. In this cas
253c0 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a  e b-tree root.**
253d0 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f   pages may be mo
253e0 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66  ved or deleted f
253f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
25400 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b   altogether, mak
25410 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65  ing.** it unsafe
25420 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
25430 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  s to continue..*
25440 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74  *.** If the writ
25450 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72  eOnly flag is tr
25460 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ue and an error 
25470 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
25480 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20  hile .** saving 
25490 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
254a0 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f  tion of a read-o
254b0 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20  nly cursor, all 
254c0 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63  cursors, .** inc
254d0 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d  luding all read-
254e0 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
254f0 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ped..**.** SQLIT
25500 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
25510 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
25520 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
25530 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73  ccurs while.** s
25540 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70  aving a cursor p
25550 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69  osition, an SQLi
25560 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
25570 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25580 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
25590 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
255a0 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74  int errCode, int
255b0 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42   writeOnly){.  B
255c0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e  tCursor *p;.  in
255d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
255e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72  ;..  assert( (wr
255f0 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72  iteOnly==0 || wr
25600 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42  iteOnly==1) && B
25610 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31  TCF_WriteFlag==1
25620 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65   );.  if( pBtree
25630 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
25640 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
25650 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74  );.    for(p=pBt
25660 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
25670 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
25680 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69  ){.      if( wri
25690 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75  teOnly && (p->cu
256a0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
256b0 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20  iteFlag)==0 ){. 
256c0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53         if( p->eS
256d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
256e0 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d  ID || p->eState=
256f0 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
25700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
25710 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
25720 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
25730 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25750 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
25760 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
25770 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63  rsors(pBtree, rc
25780 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
25790 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
257a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
257b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
257c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
257d0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
257e0 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
257f0 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
25800 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69  ;.        p->ski
25810 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
25820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
25830 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
25840 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20  rsorPages(p);.  
25850 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
25860 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
25870 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
25880 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
25890 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
258a0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
258b0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
258c0 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
258d0 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
258e0 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
258f0 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
25900 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
25910 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
25920 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
25930 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
25940 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
25950 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
25960 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
25970 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
25980 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
25990 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
259a0 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
259b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
259c0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
259d0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
259e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
259f0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
25a00 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
25a10 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
25a20 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
25a30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25a40 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
25a50 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
25a60 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
25a70 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
25a80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
25a90 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
25aa0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
25ab0 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
25ac0 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
25ad0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
25ae0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
25af0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
25b00 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
25b10 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
25b20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
25b30 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
25b40 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
25b50 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
25b60 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
25b70 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
25b80 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
25b90 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
25ba0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
25bb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
25bc0 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
25bd0 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
25be0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
25bf0 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
25c00 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
25c10 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
25c20 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
25c30 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
25c40 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
25c50 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
25c60 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
25c70 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
25c80 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
25c90 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
25ca0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
25cb0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
25cc0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
25cd0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
25ce0 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
25cf0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
25d00 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
25d10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
25d20 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
25d30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
25d40 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
25d50 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
25d60 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
25d70 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
25d80 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
25d90 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
25da0 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
25db0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
25dc0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
25dd0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
25de0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
25df0 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
25e00 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
25e10 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
25e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
25e30 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
25e40 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
25e50 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
25e60 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
25e70 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
25e80 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
25e90 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
25ea0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
25eb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
25ec0 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
25ed0 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
25ee0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
25ef0 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
25f00 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
25f10 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
25f20 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
25f30 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d  Cursors(pBt, 1)=
25f40 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
25f50 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
25f60 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
25f70 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
25f80 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
25f90 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
25fa0 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
25fb0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
25fc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25fd0 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
25fe0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
25ff0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
26000 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
26010 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
26020 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
26030 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
26040 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
26050 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
26060 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
26070 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
26080 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
26090 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
260a0 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
260b0 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
260c0 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
260d0 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
260e0 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
260f0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
26100 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
26110 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
26120 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
26130 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
26140 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
26150 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
26160 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
26170 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
26180 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
26190 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
261a0 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
261b0 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
261c0 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
261d0 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
261e0 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
261f0 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
26200 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
26210 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
26220 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
26230 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
26240 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
26250 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
26260 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
26270 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
26280 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
26290 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
262a0 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
262b0 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
262c0 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
262d0 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
262e0 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
262f0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
26300 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
26310 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
26320 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
26330 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
26340 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
26350 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
26360 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
26370 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
26380 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
26390 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
263a0 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
263b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
263c0 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
263d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
263e0 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
263f0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
26400 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
26410 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
26420 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
26430 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
26440 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
26450 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
26460 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
26470 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LY)==0 );.  asse
26480 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
26490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
264a0 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
264b0 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
264c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
264d0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
264e0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
264f0 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
26500 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
26510 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
26520 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
26530 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
26540 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
26550 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
26560 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
26570 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
26580 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
26590 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
265a0 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
265b0 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
265c0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
265d0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
265e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
265f0 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
26600 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
26610 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
26620 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
26630 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
26640 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
26660 20 62 74 72 65 65 50 74 72 6d 61 70 42 65 67 69   btreePtrmapBegi
26670 6e 28 70 42 74 2c 20 69 53 74 61 74 65 6d 65 6e  n(pBt, iStatemen
26680 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
26690 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
266a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
266b0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
266c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
266d0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
266e0 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
266f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
26700 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
26710 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
26720 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
26730 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
26740 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
26750 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
26760 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
26770 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
26780 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
26790 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
267a0 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
267b0 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
267c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
267d0 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
267e0 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
267f0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
26800 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
26810 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
26820 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
26830 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
26840 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
26850 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
26860 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
26870 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
26880 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
26890 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
268a0 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
268b0 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
268c0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
268d0 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
268e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
268f0 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
26900 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
26910 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
26920 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26930 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
26940 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
26950 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
26960 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
26970 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
26980 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
26990 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
269a0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
269b0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
269c0 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
269d0 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
269e0 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
269f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
26a00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
26a10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 62  eEnter(p);.    b
26a20 74 72 65 65 50 74 72 6d 61 70 45 6e 64 28 70 42  treePtrmapEnd(pB
26a30 74 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  t, op, iSavepoin
26a40 74 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  t);.    if( op==
26a50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
26a60 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
26a70 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
26a80 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
26a90 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
26aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26ac0 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
26ad0 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
26ae0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
26af0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
26b10 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20  f( iSavepoint<0 
26b20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
26b30 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c  s & BTS_INITIALL
26b40 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20  Y_EMPTY)!=0 ){. 
26b50 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
26b60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
26b70 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
26b80 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
26b90 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
26ba0 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
26bb0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
26bc0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
26bd0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
26be0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
26bf0 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
26c00 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
26c10 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
26c20 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
26c30 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
26c40 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
26c50 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
26c60 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
26c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26c80 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
26c90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26ca0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
26cb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
26cd0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
26ce0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
26cf0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
26d00 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
26d10 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
26d20 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
26d30 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
26d40 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
26d50 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
26d60 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
26d70 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
26d80 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
26d90 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
26da0 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
26db0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
26dc0 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
26dd0 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
26de0 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
26df0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
26e00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
26e10 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74   BTREE_WRCSR bit
26e20 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c   of wrFlag is cl
26e30 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ear, then the cu
26e40 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a  rsor can only.**
26e50 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
26e60 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54  ding.  If the BT
26e70 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73  REE_WRCSR bit is
26e80 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63   set, then the c
26e90 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20  ursor.** can be 
26ea0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
26eb0 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20   or for writing 
26ec0 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
26ed0 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ons for writing.
26ee0 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ** are also met.
26ef0 20 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20    These are the 
26f00 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
26f10 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
26f20 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74  rder.** for writ
26f30 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65  ing to be allowe
26f40 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
26f50 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
26f60 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
26f70 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69  th wrFlag contai
26f80 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52  ning BTREE_WRCSR
26f90 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
26fa0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
26fb0 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
26fc0 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
26fd0 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
26fe0 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
26ff0 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
27000 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
27010 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
27020 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
27030 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
27040 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
27050 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
27060 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
27070 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
27080 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
27090 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
270a0 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
270b0 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
270c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
270d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
270e0 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
270f0 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
27100 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
27110 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
27120 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
27130 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
27140 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
27150 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20  BTREE_FORDELETE 
27160 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61  bit of wrFlag ma
27170 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20  y optionally be 
27180 73 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43  set if BTREE_WRC
27190 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49  SR.** is set.  I
271a0 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73  f FORDELETE is s
271b0 65 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69  et, that is a hi
271c0 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d  nt to the implem
271d0 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  entation that.**
271e0 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c   this cursor wil
271f0 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74  l only be used t
27200 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65  o seek to and de
27210 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20  lete entries of 
27220 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70  an index.** as p
27230 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20  art of a larger 
27240 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
27250 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45  .  The FORDELETE
27260 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65   hint is not use
27270 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70  d by.** this imp
27280 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75  lementation.  Bu
27290 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69  t in a hypotheti
272a0 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20  cal alternative 
272b0 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a  storage engine .
272c0 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65  ** in which inde
272d0 78 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75  x entries are au
272e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
272f0 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70  ted when corresp
27300 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20  onding table.** 
27310 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64  rows are deleted
27320 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20  , the FORDELETE 
27330 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74  flag is a hint t
27340 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64  hat all SEEK and
27350 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61   DELETE.** opera
27360 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75  tions on this cu
27370 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f  rsor can be no-o
27380 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20  ps and all READ 
27390 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a  operations can .
273a0 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c  ** return a null
273b0 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30   row (2-bytes: 0
273c0 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a  x01 0x00)..**.**
273d0 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
273e0 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
273f0 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
27400 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
27410 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
27420 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
27430 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
27440 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
27450 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
27460 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
27470 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
27480 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ed that the sqli
27490 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
274a0 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  ro() has been ca
274b0 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20  lled.** on pCur 
274c0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
274d0 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70  e memory space p
274e0 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
274f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
27500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
27510 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
27520 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27540 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
27550 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27580 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
27590 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
275a0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
275b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275c0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
275d0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
275e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
275f0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27610 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
27620 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
27630 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
27640 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
27650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27660 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
27670 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  rsor */.){.  BtS
27680 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
27690 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
276a0 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d      /* Shared b-
276b0 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tree handle */. 
276c0 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20   BtCursor *pX;  
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69          /* Loopi
276f0 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c  ng over other al
27700 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20  l cursors */..  
27710 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
27720 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
27730 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
27740 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20  rFlag==0 .      
27750 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45   || wrFlag==BTRE
27760 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20  E_WRCSR .       
27770 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45  || wrFlag==(BTRE
27780 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f  E_WRCSR|BTREE_FO
27790 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a  RDELETE) .  );..
277a0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
277b0 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
277c0 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
277d0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
277e0 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
277f0 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
27800 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
27810 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
27820 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
27830 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
27840 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
27850 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
27860 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
27870 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
27880 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
27890 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
278a0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
278b0 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
278c0 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46  KeyInfo!=0, (wrF
278d0 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61  lag?2:1)) );.  a
278e0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
278f0 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
27900 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
27910 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
27920 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
27930 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
27940 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
27950 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
27960 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
27970 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
27980 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
27990 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
279a0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
279b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
279c0 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
279d0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  e1->aData );.  a
279e0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
279f0 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
27a00 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
27a10 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  LY)==0 );..  if(
27a20 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61   wrFlag ){.    a
27a30 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
27a40 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70  (pBt);.    if( p
27a50 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30  Bt->pTmpSpace==0
27a60 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
27a70 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
27a80 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
27a90 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
27aa0 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
27ab0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
27ac0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
27ad0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
27ae0 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
27af0 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
27b00 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
27b10 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
27b20 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
27b30 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
27b40 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
27b50 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
27b60 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
27b70 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
27b80 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
27b90 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
27ba0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
27bb0 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
27bc0 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
27bd0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
27be0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77  ur->curFlags = w
27bf0 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69  rFlag ? BTCF_Wri
27c00 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43  teFlag : 0;.  pC
27c10 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
27c20 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a  s = wrFlag ? 0 :
27c30 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
27c40 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65  NLY;.  /* If the
27c50 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f  re are two or mo
27c60 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  re cursors on th
27c70 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68  e same btree, th
27c80 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a  en all such.  **
27c90 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20   cursors *must* 
27ca0 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75  have the BTCF_Mu
27cb0 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
27cc0 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74   */.  for(pX=pBt
27cd0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70  ->pCursor; pX; p
27ce0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
27cf0 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f    if( pX->pgnoRo
27d00 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65  ot==(Pgno)iTable
27d10 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75   ){.      pX->cu
27d20 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
27d30 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70  ultiple;.      p
27d40 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
27d50 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
27d60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
27d70 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
27d80 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70  Cursor;.  pBt->p
27d90 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
27da0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
27db0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
27dc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27dd0 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
27de0 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
27df0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e20 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
27e30 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
27e60 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
27e70 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
27e80 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
27eb0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
27ec0 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
27ed0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
27ee0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
27ef0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
27f00 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
27f10 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
27f20 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f40 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
27f50 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
27f60 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
27f70 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20  iTable<1 ){.    
27f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
27f90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  UPT_BKPT;.  }els
27fa0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  e{.    sqlite3Bt
27fb0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
27fc0 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
27fd0 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
27fe0 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
27ff0 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Cur);.    sqlite
28000 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
28010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28030 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42   the size of a B
28040 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
28050 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  n bytes..**.** T
28060 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69  his interfaces i
28070 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74  s needed so that
28080 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72   users of cursor
28090 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74  s can preallocat
280a0 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20  e.** sufficient 
280b0 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20  storage to hold 
280c0 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42  a cursor.  The B
280d0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
280e0 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75  s opaque.** to u
280f0 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e  sers so they can
28100 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f  not do the sizeo
28110 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d  f() themselves -
28120 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a   they must call.
28130 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
28140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
28150 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76  treeCursorSize(v
28160 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52  oid){.  return R
28170 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43  OUND8(sizeof(BtC
28180 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ursor));.}../*.*
28190 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
281a0 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ory that will be
281b0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
281c0 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
281d0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d  t..**.** The sim
281e0 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72  ple approach her
281f0 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65  e would be to me
28200 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72  mset() the entir
28210 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a  e object.** to z
28220 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72  ero.  But it tur
28230 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  ns out that the 
28240 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
28250 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64  dx[] arrays.** d
28260 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  o not need to be
28270 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79   zeroed and they
28280 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77   are large, so w
28290 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74  e can save a lot
282a0 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20  .** of run-time 
282b0 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  by skipping the 
282c0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
282d0 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73  f those elements
282e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
282f0 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
28300 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
28310 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66   memset(p, 0, of
28320 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c  fsetof(BtCursor,
28330 20 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54 5f   BTCURSOR_FIRST_
28340 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a  UNINIT));.}../*.
28350 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
28360 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
28370 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
28380 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
28390 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
283a0 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
283b0 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
283c0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
283d0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
283e0 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
283f0 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
28400 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
28410 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  ee ){.    BtShar
28420 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
28430 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
28440 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
28450 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
28460 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  pBt->pCursor!=0 
28470 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
28480 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b  pCursor==pCur ){
28490 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
284a0 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
284b0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
284c0 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50      BtCursor *pP
284d0 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  rev = pBt->pCurs
284e0 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  or;.      do{.  
284f0 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d        if( pPrev-
28500 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a  >pNext==pCur ){.
28510 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d            pPrev-
28520 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
28530 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
28540 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
28550 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d  .        pPrev =
28560 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20   pPrev->pNext;. 
28570 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57       }while( ALW
28580 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20  AYS(pPrev) );.  
28590 20 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65 6c    }.    btreeRel
285a0 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
285b0 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75 6e  es(pCur);.    un
285c0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
285d0 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  d(pBt);.    sqli
285e0 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61  te3_free(pCur->a
285f0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73  Overflow);.    s
28600 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
28610 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c  ->pKey);.    sql
28620 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
28630 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
28640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28650 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
28660 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
28670 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
28680 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
28690 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
286a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
286b0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
286c0 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
286d0 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
286e0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
286f0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
28700 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
28710 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
28720 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
28730 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
28740 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
28750 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
28760 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74  r of calls to bt
28770 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
28780 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
28790 47 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  G.  static int c
287a0 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c  ellInfoEqual(Cel
287b0 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e  lInfo *a, CellIn
287c0 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20  fo *b){.    if( 
287d0 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79  a->nKey!=b->nKey
287e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
287f0 20 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64   if( a->pPayload
28800 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20  !=b->pPayload ) 
28810 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
28820 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62  ( a->nPayload!=b
28830 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74  ->nPayload ) ret
28840 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
28850 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f  ->nLocal!=b->nLo
28860 63 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  cal ) return 0;.
28870 20 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65      if( a->nSize
28880 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74  !=b->nSize ) ret
28890 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72  urn 0;.    retur
288a0 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69  n 1;.  }.  stati
288b0 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
288c0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
288d0 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
288e0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65  nfo info;.    me
288f0 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
28900 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
28910 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
28920 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
28930 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a  ur->ix, &info);.
28940 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
28950 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e  UPT_DB || cellIn
28960 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26  foEqual(&info, &
28970 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20  pCur->info) );. 
28980 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
28990 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
289a0 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  o(x).#endif.stat
289b0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
289c0 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  NE void getCellI
289d0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
289e0 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
289f0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
28a00 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  {.    pCur->curF
28a10 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
28a20 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65  idNKey;.    btre
28a30 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
28a40 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c  >pPage,pCur->ix,
28a50 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
28a60 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
28a70 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
28a80 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
28a90 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
28aa0 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
28ab0 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
28ac0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
28ad0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
28ae0 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
28af0 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
28b00 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
28b10 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
28b20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
28b30 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
28b40 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
28b50 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
28b60 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
28b70 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
28b80 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
28b90 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
28ba0 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
28bb0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
28bc0 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
28bd0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
28be0 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
28bf0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
28c00 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
28c10 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20  * NDEBUG */.int 
28c20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
28c30 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75  orIsValidNN(BtCu
28c40 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
28c50 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
28c60 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
28c70 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28c80 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
28c90 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
28ca0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
28cb0 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66  key or "rowid" f
28cc0 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  or a table btree
28cd0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
28ce0 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
28cf0 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
28d00 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
28d10 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  to a.** ordinary
28d20 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49   table btree.  I
28d30 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  f the cursor poi
28d40 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  nts to an index 
28d50 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69  btree or.** is i
28d60 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75  nvalid, the resu
28d70 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  lt of this routi
28d80 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ne is undefined.
28d90 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
28da0 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42  treeIntegerKey(B
28db0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
28dc0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
28dd0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
28de0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28df0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28e00 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
28e10 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
28e20 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65  ntKey );.  getCe
28e30 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
28e40 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
28e50 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65  o.nKey;.}..#ifde
28e60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
28e70 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a  OFFSET_SQL_FUNC.
28e80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
28e90 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
28ea0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
28eb0 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
28ec0 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74  the.** payload t
28ed0 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
28ee0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a  or is pointing..
28ef0 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
28f00 72 65 65 4f 66 66 73 65 74 28 42 74 43 75 72 73  reeOffset(BtCurs
28f10 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
28f20 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28f30 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28f40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28f50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28f60 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
28f70 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
28f80 74 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e  turn (i64)pCur->
28f90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28  pBt->pageSize*((
28fa0 69 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d  i64)pCur->pPage-
28fb0 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20  >pgno - 1) +.   
28fc0 20 20 20 20 20 20 28 69 36 34 29 28 70 43 75 72        (i64)(pCur
28fd0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  ->info.pPayload 
28fe0 2d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  - pCur->pPage->a
28ff0 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Data);.}.#endif 
29000 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
29010 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
29020 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
29030 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
29040 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
29050 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
29060 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63  hat pCur is.** c
29070 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
29080 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65  g to.  For table
29090 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
290a0 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74  ll be the amount
290b0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f  .** of data.  Fo
290c0 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20  r index btrees, 
290d0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
290e0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79   size of the key
290f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
29100 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
29110 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
29120 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
29130 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
29140 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
29150 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
29160 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
29170 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
29180 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
29190 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
291a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
291b0 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  ALID..*/.u32 sql
291c0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
291d0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
291e0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
291f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
29200 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
29210 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
29220 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
29230 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
29240 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
29250 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
29260 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  oad;.}../*.** Gi
29270 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
29280 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
29290 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
292a0 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
292b0 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
292c0 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
292d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
292e0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
292f0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
29300 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
29310 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
29320 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
29330 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
29340 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
29350 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
29360 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
29370 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
29380 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
29390 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
293a0 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
293b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
293c0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
293d0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
293e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
293f0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
29400 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
29410 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
29420 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
29430 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
29440 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
29450 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
29460 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
29470 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
29480 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
29490 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
294a0 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
294b0 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
294c0 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
294d0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
294e0 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
294f0 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
29500 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
29510 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
29520 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
29530 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
29540 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
29550 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
29560 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
29570 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
29580 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
29590 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
295a0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
295b0 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
295c0 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
295d0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
295e0 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
295f0 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
29600 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
29610 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
29620 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
29630 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
29640 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
29650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
29660 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
29670 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
29680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29690 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
296a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
296b0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
296c0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
296d0 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
296e0 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
296f0 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
29700 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
29710 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
29720 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
29730 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
29740 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
29750 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
29760 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
29770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
29780 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29790 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
297a0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
297b0 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
297c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
297d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
297e0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
297f0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
29800 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
29810 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
29820 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
29830 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
29840 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
29850 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
29860 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
29870 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
29880 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
29890 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
298a0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
298b0 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
298c0 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
298d0 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
298e0 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
298f0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
29900 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
29910 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
29920 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
29930 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
29940 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
29950 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
29960 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
29970 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
29980 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
29990 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
299a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
299b0 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
299c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
299d0 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
299e0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
299f0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
29a00 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
29a10 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
29a20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
29a30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
29a40 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
29a50 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
29a60 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
29a70 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
29a80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29a90 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
29aa0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
29ab0 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
29ac0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
29ad0 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
29ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29af0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
29b00 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
29b10 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
29b20 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
29b30 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
29b40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
29b50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
29b60 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
29b70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29b80 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
29b90 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
29ba0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
29bb0 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
29bc0 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
29bd0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
29be0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
29bf0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
29c00 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
29c10 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
29c20 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
29c30 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
29c40 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
29c50 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
29c60 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
29c70 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
29c80 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
29c90 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
29ca0 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
29cb0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
29cc0 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
29cd0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
29ce0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
29cf0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
29d00 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
29d10 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
29d20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
29d30 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
29d40 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
29d50 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
29d60 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
29d70 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
29d80 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
29d90 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
29da0 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
29db0 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
29dc0 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
29dd0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29de0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
29df0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
29e00 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
29e10 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
29e20 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
29e30 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
29e40 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
29e50 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
29e60 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
29e70 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
29e80 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
29e90 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
29ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29eb0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
29ec0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
29ed0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
29ee0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
29ef0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
29f00 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
29f10 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
29f20 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
29f30 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
29f40 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
29f50 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
29f60 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
29f70 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
29f80 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
29f90 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
29fa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29fb0 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
29fc0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29fe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29ff0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
2a000 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
2a010 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
2a020 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
2a030 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
2a040 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
2a050 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
2a060 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
2a070 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
2a080 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a090 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2a0a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2a0b0 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
2a0c0 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
2a0d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
2a0e0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
2a0f0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
2a100 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
2a110 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
2a120 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
2a130 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
2a140 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
2a150 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
2a160 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
2a170 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
2a180 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
2a190 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
2a1a0 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
2a1b0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
2a1c0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
2a1d0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
2a1e0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
2a1f0 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
2a200 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
2a210 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
2a220 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
2a230 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
2a240 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
2a250 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
2a260 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
2a270 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
2a280 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
2a290 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
2a2a0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
2a2b0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
2a2c0 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
2a2d0 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
2a2e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
2a2f0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
2a300 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
2a310 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
2a320 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74  ly populate.** t
2a330 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2a340 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61  -list cache arra
2a350 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
2a360 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73  rflow). .** Subs
2a370 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
2a380 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d   this cache to m
2a390 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
2a3a0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
2a3b0 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69  et .** more effi
2a3c0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
2a3d0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
2a3e0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
2a3f0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
2a400 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20  , it must be.** 
2a410 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
2a420 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
2a430 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
2a440 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
2a450 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
2a460 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
2a470 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
2a480 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
2a490 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
2a4a0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
2a4b0 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
2a4c0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
2a4d0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
2a4e0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
2a4f0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
2a500 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
2a510 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
2a520 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
2a530 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
2a540 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
2a550 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
2a560 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
2a570 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
2a580 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
2a590 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2a5a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
2a5b0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
2a5c0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
2a5d0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
2a5e0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
2a5f0 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
2a600 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
2a610 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
2a620 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
2a630 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
2a640 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2a650 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
2a660 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
2a670 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
2a680 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
2a690 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
2a6a0 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
2a6b0 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
2a6c0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
2a6d0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
2a6e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a6f0 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
2a700 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
2a710 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2a720 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2a730 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
2a740 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
2a750 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
2a760 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
2a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a780 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
2a790 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
2a7a0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2a7b0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
2a7c0 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
2a7d0 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
2a7e0 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
2a7f0 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
2a800 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75   original out bu
2a810 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ffer */.#endif..
2a820 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
2a830 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70  );.  assert( eOp
2a840 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b  ==0 || eOp==1 );
2a850 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a860 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a870 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2a880 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67  t( pCur->ix<pPag
2a890 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
2a8a0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2a8b0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2a8c0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
2a8d0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
2a8e0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   = pCur->info.pP
2a8f0 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74  ayload;.  assert
2a900 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
2a910 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
2a920 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  oad );..  assert
2a930 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61  ( aPayload > pPa
2a940 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69  ge->aData );.  i
2a950 66 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f  f( (uptr)(aPaylo
2a960 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74  ad - pPage->aDat
2a970 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c  a) > (pBt->usabl
2a980 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e  eSize - pCur->in
2a990 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  fo.nLocal) ){.  
2a9a0 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
2a9b0 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
2a9c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2a9d0 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
2a9e0 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63  r.  The.    ** c
2a9f0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
2aa00 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20   is really:.    
2aa10 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b  **    &aPayload[
2aa20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
2aa30 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
2aa40 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
2aa50 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69  ze].    ** but i
2aa60 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74  s recast into it
2aa70 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74  s current form t
2aa80 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20  o avoid integer 
2aa90 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d  overflow problem
2aaa0 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  s.    */.    ret
2aab0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2aac0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
2aad0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
2aae0 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
2aaf0 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
2ab00 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
2ab10 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
2ab20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
2ab30 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
2ab40 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
2ab50 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
2ab60 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
2ab70 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
2ab80 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
2ab90 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
2aba0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
2abb0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
2abc0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
2abd0 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
2abe0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
2abf0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
2ac00 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
2ac10 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
2ac20 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
2ac30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
2ac40 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63  ;.  }...  if( rc
2ac50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
2ac60 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
2ac70 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
2ac80 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2ac90 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
2aca0 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
2acb0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
2acc0 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
2acd0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
2ace0 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
2acf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
2ad00 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
2ad10 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
2ad20 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20  rflow[] has not 
2ad30 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
2ad40 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
2ad50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2ad60 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
2ad70 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
2ad80 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
2ad90 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
2ada0 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  e.    ** in the 
2adb0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
2adc0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
2add0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
2ade0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20  rflow page is.  
2adf0 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
2ae00 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63  Overflow[0], etc
2ae10 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
2ae20 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
2ae30 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d  ] array.    ** m
2ae40 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
2ae50 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20  own" (the cache 
2ae60 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
2ae70 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
2ae80 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
2ae90 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2aea0 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  dOvfl)==0 ){.   
2aeb0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
2aec0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
2aed0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
2aee0 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
2aef0 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
2af00 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
2af10 72 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20  rflow==0.       
2af20 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69  || nOvfl*(int)si
2af30 7a 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c  zeof(Pgno) > sql
2af40 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
2af50 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a  Cur->aOverflow).
2af60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2af70 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50   Pgno *aNew = (P
2af80 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  gno*)sqlite3Real
2af90 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  loc(.           
2afa0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2afb0 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66  , nOvfl*2*sizeof
2afc0 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  (Pgno).        )
2afd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ;.        if( aN
2afe0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
2aff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b000 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2b010 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b020 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
2b030 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
2b040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b050 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
2b060 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
2b070 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
2b080 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72  no));.      pCur
2b090 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2b0a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
2b0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2b0c0 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
2b0d0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
2b0e0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
2b0f0 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
2b100 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
2b110 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
2b120 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
2b130 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
2b140 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
2b150 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a  y to it..      *
2b160 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
2b170 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
2b180 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
2b190 20 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28          iIdx = (
2b1a0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
2b1b0 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61  ;.        nextPa
2b1c0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
2b1d0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
2b1e0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
2b1f0 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
2b200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2b210 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2b220 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
2b230 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 );.    while( 
2b240 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20  nextPage ){.    
2b250 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
2b260 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
2b270 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
2b280 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
2b290 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b2a0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
2b2b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2b2c0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
2b2d0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
2b2e0 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  age.            
2b2f0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
2b300 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
2b310 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
2b320 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
2b330 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
2b340 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
2b350 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
2b360 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
2b370 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
2b380 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
2b390 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
2b3a0 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
2b3b0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
2b3c0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
2b3d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
2b3e0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
2b3f0 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
2b400 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
2b410 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
2b420 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
2b430 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
2b440 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
2b450 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
2b460 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
2b470 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
2b480 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2b490 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
2b4a0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2b4b0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
2b4c0 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
2b4d0 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
2b4e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
2b4f0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
2b500 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
2b510 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
2b520 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
2b530 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
2b540 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b550 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
2b560 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
2b570 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
2b580 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2b590 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
2b5a0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
2b5b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2b5c0 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
2b5d0 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
2b5e0 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
2b5f0 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
2b600 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
2b610 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
2b620 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
2b630 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
2b640 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
2b650 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
2b660 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
2b670 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
2b680 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
2b690 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68   /* File from wh
2b6a0 69 63 68 20 74 6f 20 64 6f 20 64 69 72 65 63 74  ich to do direct
2b6b0 20 6f 76 65 72 66 6c 6f 77 20 72 65 61 64 20 2a   overflow read *
2b6c0 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  /.#endif.       
2b6d0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
2b6e0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
2b6f0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
2b700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
2b710 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
2b720 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
2b730 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
2b740 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
2b750 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
2b760 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
2b770 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
2b780 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2b790 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
2b7a0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
2b7b0 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
2b7c0 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
2b7d0 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
2b7e0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
2b7f0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
2b800 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
2b810 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
2b820 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  n write-transact
2b830 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ion, and.       
2b840 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74   **   4) the dat
2b850 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
2b860 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
2b870 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61    **   5) the pa
2b880 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
2b890 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20   WAL file.      
2b8a0 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61    **   6) at lea
2b8b0 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
2b8c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
2b8d0 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
2b8e0 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
2b8f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2b900 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
2b910 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
2b920 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2b930 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
2b940 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
2b950 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
2b960 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
2b970 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
2b980 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
2b990 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
2b9a0 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
2b9b0 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
2b9c0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
2b9d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2b9e0 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20  if( eOp==0      
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba10 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
2ba20 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
2ba30 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
2ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba60 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
2ba70 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
2ba80 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2ba90 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
2baa0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20           /* (3) 
2bab0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
2bac0 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
2bad0 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
2bae0 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
2baf0 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
2bb00 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
2bb10 65 33 50 61 67 65 72 55 73 65 57 61 6c 28 70 42  e3PagerUseWal(pB
2bb20 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
2bb30 61 67 65 29 20 20 20 20 20 20 20 2f 2a 20 28 35  age)       /* (5
2bb40 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
2bb50 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66   &pBuf[-4]>=pBuf
2bb60 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20  Start           
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb80 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
2bb90 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2bba0 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
2bbb0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
2bbc0 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
2bbd0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2bbe0 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66  rt( aWrite>=pBuf
2bbf0 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20  Start );        
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc10 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a   /* due to (6) *
2bc20 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
2bc30 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
2bc40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2bc50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
2bc60 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
2bc70 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
2bc80 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
2bc90 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
2bca0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
2bcb0 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
2bcc0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
2bcd0 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
2bce0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
2bcf0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
2bd00 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
2bd10 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
2bd20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2bd30 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
2bd40 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
2bd50 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
2bd60 20 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d            (eOp==
2bd70 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
2bd80 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20  ADONLY : 0).    
2bd90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2bda0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bdb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bdc0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
2bdd0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
2bde0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
2bdf0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
2be00 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
2be10 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
2be20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
2be30 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
2be40 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
2be50 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
2be60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2be70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2be80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2be90 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
2bea0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2beb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bec0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
2bed0 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72    if( amt==0 ) r
2bee0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2bef0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
2bf00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2bf10 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
2bf20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iIdx++;.    }. 
2bf30 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
2bf40 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
2bf50 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66   ){.    /* Overf
2bf60 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70  low chain ends p
2bf70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20  rematurely */.  
2bf80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bf90 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
2bfa0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
2bfb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2bfc0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
2bfd0 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20  payload for the 
2bfe0 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61  row at which tha
2bff0 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
2c000 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
2c010 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62  inting.  "amt" b
2c020 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
2c030 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42  nsferred into pB
2c040 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
2c050 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
2c060 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
2c070 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69   pCur can be poi
2c080 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20  nting to either 
2c090 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e  a table or an in
2c0a0 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49  dex b-tree..** I
2c0b0 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  f pointing to a 
2c0c0 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65  table btree, the
2c0d0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65  n the content se
2c0e0 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20  ction is read.  
2c0f0 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f  If.** pCur is po
2c100 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64  inting to an ind
2c110 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74  ex b-tree then t
2c120 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69  he key section i
2c130 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s read..**.** Fo
2c140 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  r sqlite3BtreePa
2c150 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c  yload(), the cal
2c160 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
2c170 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
2c180 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
2c190 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74  lid row in the t
2c1a0 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74  able.  For sqlit
2c1b0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68  e3BtreePayloadCh
2c1c0 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20  ecked(), the.** 
2c1d0 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20  cursor might be 
2c1e0 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74  invalid or might
2c1f0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74   need to be rest
2c200 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ored before bein
2c210 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  g read..**.** Re
2c220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
2c230 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
2c240 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2c250 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
2c260 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
2c270 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
2c280 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
2c290 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
2c2a0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
2c2b0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
2c2c0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
2c2d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2c2e0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
2c2f0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
2c300 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2c310 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2c320 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2c330 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c340 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2c350 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2c360 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
2c370 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
2c380 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72  t( pCur->ix<pCur
2c390 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
2c3a0 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
2c3b0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
2c3c0 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
2c3d0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
2c3e0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
2c3f0 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73  his variant of s
2c400 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
2c410 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20  ad() works even 
2c420 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  if the cursor ha
2c430 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  s not.** in the 
2c440 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61  CURSOR_VALID sta
2c450 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  te.  It is only 
2c460 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  used by the sqli
2c470 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a  te3_blob_read().
2c480 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ** interface..*/
2c490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c4a0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74  OMIT_INCRBLOB.st
2c4b0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2c4c0 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50  LINE int accessP
2c4d0 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20  ayloadChecked(. 
2c4e0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2c4f0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20  .  u32 offset,. 
2c500 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64   u32 amt,.  void
2c510 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20   *pBuf.){.  int 
2c520 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d  rc;.  if ( pCur-
2c530 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2c540 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
2c550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
2c560 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  RT;.  }.  assert
2c570 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2c580 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2c590 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72  rc = btreeRestor
2c5a0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2c5b0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
2c5c0 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73  rc ? rc : access
2c5d0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
2c5e0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
2c5f0 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
2c600 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68  e3BtreePayloadCh
2c610 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a  ecked(BtCursor *
2c620 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
2c630 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
2c640 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43  *pBuf){.  if( pC
2c650 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2c660 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2c670 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2c680 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2c690 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   );.    return a
2c6a0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
2c6b0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
2c6c0 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  pBuf, 0);.  }els
2c6d0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63  e{.    return ac
2c6e0 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
2c6f0 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ed(pCur, offset,
2c700 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d   amt, pBuf);.  }
2c710 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2c720 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2c730 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  B */../*.** Retu
2c740 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2c750 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
2c760 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
2c770 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
2c780 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
2c790 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
2c7a0 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
2c7b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
2c7c0 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e  ** the key if in
2c7d0 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67  dex btrees (pPag
2c7e0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e  e->intKey==0) an
2c7f0 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f  d is the data fo
2c800 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65  r.** table btree
2c810 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
2c820 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72  ==1). The number
2c830 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
2c840 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61  ilable.** key/da
2c850 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ta is written in
2c860 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
2c870 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
2c880 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e   value.** return
2c890 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ed will not be a
2c8a0 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
2c8b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2c8c0 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
2c8d0 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
2c8e0 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
2c8f0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
2c900 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
2c910 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
2c920 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
2c930 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
2c940 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
2c950 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
2c960 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
2c970 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
2c980 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
2c990 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
2c9a0 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
2c9b0 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
2c9c0 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
2c9d0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
2c9e0 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
2c9f0 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
2ca00 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
2ca10 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
2ca20 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
2ca30 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
2ca40 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
2ca50 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
2ca60 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
2ca70 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
2ca80 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
2ca90 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
2caa0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
2cab0 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
2cac0 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
2cad0 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
2cae0 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
2caf0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
2cb00 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63  const void *fetc
2cb10 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
2cb20 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2cb30 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
2cb40 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
2cb50 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
2cb60 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20  32 *pAmt        
2cb70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2cb80 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
2cb90 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
2cba0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b  */.){.  int amt;
2cbb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
2cbc0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
2cbd0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  e>=0 && pCur->pP
2cbe0 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
2cbf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2cc00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2cc10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2cc20 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2cc30 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2cc40 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2cc50 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2cc60 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2cc70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2cc80 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2cc90 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
2cca0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2ccb0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2ccc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2ccd0 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d  oad>pCur->pPage-
2cce0 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50  >aData || CORRUP
2ccf0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
2cd00 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
2cd10 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67  yload<pCur->pPag
2cd20 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f  e->aDataEnd ||CO
2cd30 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74  RRUPT_DB);.  amt
2cd40 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
2cd50 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e  ocal;.  if( amt>
2cd60 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67  (int)(pCur->pPag
2cd70 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43  e->aDataEnd - pC
2cd80 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2cd90 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  d) ){.    /* The
2cda0 72 65 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65  re is too little
2cdb0 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
2cdc0 67 65 20 66 6f 72 20 74 68 65 20 65 78 70 65 63  ge for the expec
2cdd0 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a  ted amount.    *
2cde0 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65  * of local conte
2cdf0 6e 74 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73  nt. Database mus
2ce00 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
2ce10 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
2ce20 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61  RUPT_DB );.    a
2ce30 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74  mt = MAX(0, (int
2ce40 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  )(pCur->pPage->a
2ce50 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e  DataEnd - pCur->
2ce60 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b  info.pPayload));
2ce70 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28  .  }.  *pAmt = (
2ce80 75 33 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72  u32)amt;.  retur
2ce90 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69  n (void*)pCur->i
2cea0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.pPayload;.}.
2ceb0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
2cec0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
2ced0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
2cee0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
2cef0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
2cf00 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
2cf10 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
2cf20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
2cf30 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
2cf40 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
2cf50 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
2cf60 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
2cf70 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
2cf80 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
2cf90 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
2cfa0 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
2cfb0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
2cfc0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
2cfd0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
2cfe0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
2cff0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
2d000 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
2d010 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
2d020 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
2d030 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
2d040 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
2d050 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
2d060 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
2d070 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
2d080 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
2d090 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
2d0a0 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
2d0b0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
2d0c0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2d0d0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
2d0e0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
2d0f0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
2d100 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79  *sqlite3BtreePay
2d110 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73  loadFetch(BtCurs
2d120 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
2d130 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
2d140 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
2d150 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
2d160 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2d170 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
2d180 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
2d190 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
2d1a0 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
2d1b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2d1c0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
2d1d0 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
2d1e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2d1f0 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
2d200 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
2d210 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
2d220 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
2d230 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
2d240 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
2d250 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
2d260 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
2d270 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
2d280 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
2d290 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
2d2a0 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
2d2b0 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
2d2c0 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
2d2d0 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
2d2e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2d2f0 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74  2 newPgno){.  Bt
2d300 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
2d310 75 72 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72  ur->pBt;.  int r
2d320 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
2d330 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2d340 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2d350 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2d360 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2d370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d380 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
2d390 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
2d3a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2d3b0 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  age>=0 );.  if( 
2d3c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54  pCur->iPage>=(BT
2d3d0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
2d3e0 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
2d3f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2d400 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75  _BKPT;.  }.  pCu
2d410 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2d420 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2d430 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2d440 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2d450 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
2d460 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d470 67 65 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a  ge] = pCur->ix;.
2d480 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
2d490 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43  Cur->iPage] = pC
2d4a0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75  ur->pPage;.  pCu
2d4b0 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75  r->ix = 0;.  pCu
2d4c0 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 72 63  r->iPage++;.  rc
2d4d0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2d4e0 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
2d4f0 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20  &pCur->pPage,.  
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72        pCur, pCur
2d520 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
2d530 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2d540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 65 74  TE_OK ){.    set
2d550 4d 65 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72  MempageRoot(pCur
2d560 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 70  ->pPage, pCur->p
2d570 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20 20  gnoRoot);.  }.  
2d580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
2d590 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2d5a0 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
2d5b0 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
2d5c0 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
2d5d0 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
2d5e0 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
2d5f0 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
2d600 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
2d610 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
2d620 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
2d630 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
2d640 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
2d650 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
2d660 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2d670 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
2d680 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
2d690 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
2d6a0 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
2d6b0 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
2d6c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d6d0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
2d6e0 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
2d6f0 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
2d700 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69  gno iChild){.  i
2d710 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
2d720 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
2d730 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65  conditions teste
2d740 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f  d below might no
2d750 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20  t be true.      
2d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d770 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f        ** in a co
2d780 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a  rrupt database *
2d790 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  /.  assert( iIdx
2d7a0 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
2d7b0 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
2d7c0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2d7d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
2d7e0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
2d7f0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2d800 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
2d810 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
2d820 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
2d830 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2d840 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
2d850 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
2d860 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
2d870 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
2d880 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
2d890 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
2d8a0 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
2d8b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2d8c0 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
2d8d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
2d8e0 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
2d8f0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
2d900 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
2d910 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
2d920 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
2d930 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
2d940 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
2d950 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
2d960 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
2d970 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
2d980 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
2d990 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
2d9a0 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
2d9b0 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
2d9c0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2d9d0 67 65 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73  ge *pLeaf;.  ass
2d9e0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2d9f0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2da00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2da10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2da20 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2da30 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
2da40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2da50 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
2da60 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2da70 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
2da80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2da90 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
2daa0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2dab0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70  1], .    pCur->p
2dac0 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  Page->pgno.  );.
2dad0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
2dae0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2daf0 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
2db00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2db10 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  e-1]->nCell );. 
2db20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2db30 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2db40 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2db50 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2db60 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
2db70 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e  Cur->ix = pCur->
2db80 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2db90 65 2d 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20  e-1];.  pLeaf = 
2dba0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
2dbb0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75  Cur->pPage = pCu
2dbc0 72 2d 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72  r->apPage[--pCur
2dbd0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65  ->iPage];.  rele
2dbe0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2dbf0 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Leaf);.}../*.** 
2dc00 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2dc10 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2dc20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
2dc30 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
2dc40 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2dc50 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
2dc60 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
2dc70 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
2dc80 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
2dc90 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
2dca0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
2dcb0 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
2dcc0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
2dcd0 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
2dce0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2dcf0 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
2dd00 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
2dd10 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
2dd20 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
2dd30 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
2dd40 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
2dd50 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
2dd60 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
2dd70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
2dd80 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
2dd90 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
2dda0 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2ddb0 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
2ddc0 56 41 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72  VALID and this r
2ddd0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
2dde0 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68  QLITE_EMPTY. Oth
2ddf0 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63  erwise,.** the c
2de00 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
2de10 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
2de20 73 74 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  st cell located 
2de30 6f 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28  on the root.** (
2de40 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
2de50 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
2de60 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
2de70 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
2de80 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
2de90 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2dea0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
2deb0 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
2dec0 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
2ded0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
2dee0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
2def0 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
2df00 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
2df10 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
2df20 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
2df30 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
2df40 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
2df50 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
2df60 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
2df70 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2df80 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
2df90 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
2dfa0 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
2dfb0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
2dfc0 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
2dfd0 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
2dfe0 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
2dff0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
2e000 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
2e010 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
2e020 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
2e030 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
2e040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e050 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
2e060 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2e070 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2e080 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2e090 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
2e0a0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2e0b0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2e0c0 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
2e0d0 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
2e0e0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2e0f0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
2e100 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
2e110 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
2e120 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
2e130 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
2e140 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2e150 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2e160 74 61 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45  tate < CURSOR_RE
2e170 51 55 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75  QUIRESEEK || pCu
2e180 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20  r->iPage<0 );.  
2e190 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2e1a0 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72  noRoot>0 || pCur
2e1b0 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20  ->iPage<0 );..  
2e1c0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
2e1d0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  =0 ){.    if( pC
2e1e0 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
2e1f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
2e200 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  tNull(pCur->pPag
2e210 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  e);.      while(
2e220 20 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29   --pCur->iPage )
2e230 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2e240 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
2e250 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2e260 69 50 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d  iPage]);.      }
2e270 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61  .      pCur->pPa
2e280 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2e290 65 5b 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e[0];.      goto
2e2a0 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20   skip_init;.    
2e2b0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
2e2c0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2e2d0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
2e2e0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2e2f0 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
2e300 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
2e310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2e320 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
2e330 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28  =(-1) );.    if(
2e340 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
2e350 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2e360 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  K ){.      if( p
2e370 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2e380 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2e390 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2e3a0 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
2e3b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
2e3c0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2e3d0 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  kipNext;.      }
2e3e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
2e3f0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
2e400 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2e410 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
2e420 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
2e430 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
2e440 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50  oRoot, &pCur->pP
2e450 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
2e470 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
2e480 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
2e490 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e4a0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2e4b0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2e4c0 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
2e4d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   rc;.    }.    s
2e4e0 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28 70 43  etMempageRoot(pC
2e4f0 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
2e500 3e 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20  >pgnoRoot);.    
2e510 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
2e520 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e  .    pCur->curIn
2e530 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 70 50 61  tKey = pCur->pPa
2e540 67 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a  ge->intKey;.  }.
2e550 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
2e560 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2e570 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
2e580 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
2e590 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70  .  /* If pCur->p
2e5a0 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
2e5b0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
2e5c0 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
2e5d0 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a   this cursor.  *
2e5e0 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70  * expected to op
2e5f0 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65  en it on an inde
2e600 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77  x b-tree. Otherw
2e610 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f  ise, if pKeyInfo
2e620 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74   is.  ** NULL, t
2e630 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74  he caller expect
2e640 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  s a table b-tree
2e650 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2e660 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20   the case,.  ** 
2e670 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
2e680 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
2e690 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69  .  **.  ** Earli
2e6a0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
2e6b0 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68  QLite assumed th
2e6c0 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75  at this test cou
2e6d0 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a  ld not fail.  **
2e6e0 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   if the root pag
2e6f0 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f  e was already lo
2e700 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  aded when this f
2e710 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
2e720 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66  ed (i.e..  ** if
2e730 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29   pCur->iPage>=0)
2e740 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f  . But this is no
2e750 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61  t so if the data
2e760 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65  base is corrupte
2e770 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20  d .  ** in such 
2e780 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20  a way that page 
2e790 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20  pRoot is linked 
2e7a0 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d  into a second b-
2e7b0 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a  tree table .  **
2e7c0 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73   (or the freelis
2e7d0 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t).  */.  assert
2e7e0 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  ( pRoot->intKey=
2e7f0 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74  =1 || pRoot->int
2e800 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Key==0 );.  if( 
2e810 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30  pRoot->isInit==0
2e820 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49   || (pCur->pKeyI
2e830 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e  nfo==0)!=pRoot->
2e840 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
2e850 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2e860 55 50 54 5f 50 41 47 45 28 70 43 75 72 2d 3e 70  UPT_PAGE(pCur->p
2e870 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70  Page);.  }..skip
2e880 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d  _init:  .  pCur-
2e890 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  >ix = 0;.  pCur-
2e8a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2e8b0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2e8c0 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
2e8d0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  st|BTCF_ValidNKe
2e8e0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2e8f0 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43  );..  pRoot = pC
2e900 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
2e910 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20   pRoot->nCell>0 
2e920 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
2e930 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2e940 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
2e950 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
2e960 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
2e970 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
2e980 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
2e990 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2e9a0 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
2e9b0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
2e9c0 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
2e9d0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
2e9e0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
2e9f0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2ea00 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
2ea10 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
2ea20 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
2ea30 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2ea40 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2ea50 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ID;.    rc = SQL
2ea60 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20  ITE_EMPTY;.  }. 
2ea70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ea80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2ea90 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
2eaa0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
2eab0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2eac0 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
2ead0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
2eae0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
2eaf0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
2eb00 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
2eb10 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
2eb20 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
2eb30 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
2eb40 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
2eb50 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
2eb60 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
2eb70 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
2eb80 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
2eb90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
2eba0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2ebb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2ebc0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2ebd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2ebe0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2ebf0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
2ec00 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2ec10 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
2ec20 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
2ec30 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
2ec40 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67  t( pCur->ix<pPag
2ec50 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2ec60 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2ec70 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2ec80 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20  pCur->ix));.    
2ec90 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2eca0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
2ecb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2ecc0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2ecd0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2ece0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
2ecf0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
2ed00 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
2ed10 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
2ed20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
2ed30 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
2ed40 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
2ed50 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
2ed60 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
2ed70 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
2ed80 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
2ed90 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
2eda0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
2edb0 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
2edc0 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
2edd0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2ede0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2edf0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2ee00 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
2ee10 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
2ee20 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
2ee30 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
2ee40 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
2ee50 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
2ee60 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
2ee70 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
2ee80 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
2ee90 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
2eea0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
2eeb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
2eec0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2eed0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
2eee0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2eef0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ef00 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2ef10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2ef20 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61  ;.  while( !(pPa
2ef30 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2ef40 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
2ef50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
2ef60 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2ef70 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2ef80 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20  );.    pCur->ix 
2ef90 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
2efa0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2efb0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
2efc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2efd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2efe0 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65  pCur->ix = pPage
2eff0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73  ->nCell-1;.  ass
2f000 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2f010 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73  nSize==0 );.  as
2f020 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2f030 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2f040 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20  idNKey)==0 );.  
2f050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f060 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2f070 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
2f080 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
2f090 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2f0a0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
2f0b0 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
2f0c0 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
2f0d0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
2f0e0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
2f0f0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
2f100 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
2f110 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2f120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2f130 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
2f140 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2f150 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2f160 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2f170 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2f180 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2f190 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2f1a0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2f1b0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2f1c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2f1d0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2f1e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f1f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2f200 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
2f210 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
2f220 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  0;.    rc = move
2f230 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2f240 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
2f250 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29  ==SQLITE_EMPTY )
2f260 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2f270 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2f280 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  || pCur->pPage->
2f290 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2f2a0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
2f2b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f2c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2f2d0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2f2e0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
2f2f0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2f300 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2f310 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2f320 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2f330 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2f340 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2f350 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2f360 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2f370 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2f380 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2f390 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2f3a0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
2f3b0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2f3c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
2f3d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2f3e0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2f3f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2f400 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2f410 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2f420 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
2f430 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2f440 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
2f450 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2f460 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
2f470 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
2f480 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
2f490 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
2f4a0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2f4b0 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
2f4c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2f4d0 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
2f4e0 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
2f4f0 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
2f500 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
2f510 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
2f520 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
2f530 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
2f540 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
2f550 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
2f560 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
2f570 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
2f580 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2f590 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
2f5a0 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
2f5b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2f5c0 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43  rt( pCur->ix==pC
2f5d0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2f5e0 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
2f5f0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  ( pCur->pPage->l
2f600 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
2f610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f620 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
2f630 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2f640 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2f650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2f660 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2f670 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2f680 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
2f690 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2f6a0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2f6b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2f6c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f6d0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2f6e0 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  |= BTCF_AtLast;.
2f6f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f700 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2f710 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
2f720 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2f730 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2f740 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PTY ){.    asser
2f750 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2f760 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
2f770 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2f780 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
2f790 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f7a0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
2f7b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2f7c0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
2f7d0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
2f7e0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
2f7f0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
2f800 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
2f810 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
2f820 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
2f830 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
2f840 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
2f850 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
2f860 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
2f870 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
2f880 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
2f890 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
2f8a0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
2f8b0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
2f8c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
2f8d0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
2f8e0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
2f8f0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
2f900 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
2f910 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
2f920 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
2f930 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
2f940 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
2f950 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
2f960 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
2f970 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
2f980 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
2f990 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
2f9a0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
2f9b0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2f9c0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
2f9d0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2f9e0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
2f9f0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
2fa00 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
2fa10 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
2fa20 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
2fa30 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
2fa40 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
2fa50 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
2fa60 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
2fa70 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
2fa80 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2fa90 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2faa0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2fac0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
2fad0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
2fae0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2faf0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
2fb00 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
2fb10 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
2fb20 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
2fb30 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
2fb40 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
2fb50 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2fb60 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2fb70 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2fb80 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2fb90 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
2fba0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
2fbb0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
2fbc0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
2fbd0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2fbe0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2fbf0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2fc10 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
2fc20 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2fc30 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  ** For index tab
2fc40 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79  les, the pIdxKey
2fc50 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69  ->eqSeen field i
2fc60 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  s set to 1 if th
2fc70 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e  ere.** exists an
2fc80 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2fc90 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79  ble that exactly
2fca0 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79   matches pIdxKey
2fcb0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
2fcc0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
2fcd0 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
2fce0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2fcf0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2fd00 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
2fd10 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2fd20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
2fd30 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
2fd40 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
2fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fd60 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
2fd70 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
2fd80 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2fd90 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
2fda0 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
2fdb0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
2fdc0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
2fdd0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2fde0 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
2fdf0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2fe00 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70  rc;.  RecordComp
2fe10 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  are xRecordCompa
2fe20 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  re;..  assert( c
2fe30 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2fe40 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2fe50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2fe60 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2fe70 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2fe80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2fe90 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
2fea0 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2feb0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2fec0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2fed0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2fee0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49  SOR_VALID || (pI
2fef0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2ff00 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20  ->curIntKey!=0) 
2ff10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2ff20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
2ff30 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
2ff40 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
2ff50 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
2ff60 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
2ff70 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
2ff80 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
2ff90 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65   */.  if( pIdxKe
2ffa0 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d  y==0.   && pCur-
2ffb0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ffc0 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
2ffd0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2ffe0 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
2fff0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
30000 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
30010 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
30020 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
30030 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
30040 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
30050 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
30060 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Key ){.      if(
30070 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
30080 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
30090 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
300a0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
300b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
300c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
300d0 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
300e0 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65  ested key is one
300f0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70   more than the p
30100 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65  revious key, the
30110 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74  n.      ** try t
30120 6f 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e  o get there usin
30130 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  g sqlite3BtreeNe
30140 78 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e  xt() rather than
30150 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a   a full.      **
30160 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20   binary search. 
30170 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
30180 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20  mization only.  
30190 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  The correct answ
301a0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  er.      ** is s
301b0 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69  till obtained wi
301c0 74 68 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c  thout this case,
301d0 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d   only a little m
301e0 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20  ore slowely */. 
301f0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
30200 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b  nfo.nKey+1==intK
30210 65 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69  ey && !pCur->ski
30220 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
30230 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
30240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30250 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
30260 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
30270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30280 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 43 65  .          getCe
30290 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
302a0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
302b0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
302c0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
302d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
302e0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
302f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
30300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
30310 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
30320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
30330 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30340 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30350 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
30360 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
30370 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
30380 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
30390 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  pare = sqlite3Vd
303a0 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49  beFindCompare(pI
303b0 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78  dxKey);.    pIdx
303c0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  Key->errCode = 0
303d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
303e0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
303f0 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c  c==1 .         |
30400 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
30410 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20  lt_rc==0 .      
30420 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
30430 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20  efault_rc==-1.  
30440 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
30450 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
30460 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79   = 0; /* All key
30470 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a  s are integers *
30480 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  /.  }..  rc = mo
30490 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
304a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
304b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
304c0 4d 50 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73  MPTY ){.      as
304d0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
304e0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
304f0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
30500 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
30510 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
30520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30530 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
30540 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
30550 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
30560 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
30570 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
30580 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
30590 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
305a0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
305b0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
305c0 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61  nCell > 0 );.  a
305d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
305e0 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ge==0 || pCur->a
305f0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
30600 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
30610 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
30620 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
30630 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
30640 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
30650 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
30660 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
30670 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
30680 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
30690 61 67 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  age;.    u8 *pCe
306a0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
306b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
306c0 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
306d0 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
306e0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
306f0 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
30700 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
30710 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
30720 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
30730 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
30740 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
30750 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
30760 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
30770 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
30780 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
30790 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
307a0 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
307b0 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
307c0 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
307d0 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
307e0 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
307f0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
30800 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
30810 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
30820 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
30830 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
30840 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
30850 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
30860 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
30870 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
30880 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
30890 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
308a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
308b0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
308c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
308d0 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
308e0 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
308f0 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
30900 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
30910 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
30920 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
30930 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
30940 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
30950 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
30960 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
30970 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
30980 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
30990 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
309a0 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
309b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
309c0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
309d0 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
309e0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
309f0 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
30a00 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20  e, idx);.       
30a10 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
30a20 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  eyLeaf ){.      
30a30 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
30a40 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
30a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30a60 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
30a70 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20  DataEnd ){.     
30a80 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30a90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
30aa0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
30ab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
30ad0 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
30ae0 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
30af0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
30b00 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c     if( nCellKey<
30b10 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
30b20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
30b30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
30b40 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31  wr>upr ){ c = -1
30b50 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
30b60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
30b70 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a  llKey>intKey ){.
30b80 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
30b90 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  idx-1;.         
30ba0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
30bb0 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d  c = +1; break; }
30bc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30bd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
30be0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
30bf0 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
30c00 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
30c10 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
30c20 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
30c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
30c40 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
30c50 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
30c60 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20  o_next_layer;.  
30c70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30c80 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
30c90 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
30ca0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
30cb0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
30cc0 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
30cd0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
30ce0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
30cf0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
30d00 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
30d10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
30d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30d40 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
30d50 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
30d60 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
30d70 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
30d80 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
30d90 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  2; */.      }.  
30da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
30db0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
30dc0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53  int nCell;  /* S
30dd0 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c  ize of the pCell
30de0 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a   cell in bytes *
30df0 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  /.        pCell 
30e00 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
30e10 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a  r(pPage, idx);..
30e20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
30e30 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
30e40 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
30e50 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
30e60 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
30e70 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
30e80 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
30e90 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
30ea0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
30eb0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
30ec0 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
30ed0 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
30ee0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
30ef0 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
30f00 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
30f10 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
30f20 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
30f30 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
30f40 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
30f50 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
30f60 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
30f70 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
30f80 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
30f90 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
30fa0 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
30fb0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
30fc0 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
30fd0 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
30fe0 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
30ff0 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
31000 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  */.        nCell
31010 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
31020 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
31030 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
31040 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
31050 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
31060 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
31070 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
31080 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
31090 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
310a0 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
310b0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
310c0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
310d0 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
310e0 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
310f0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
31100 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
31110 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67  ll+nCell+1==pPag
31120 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
31130 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
31140 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
31150 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
31160 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
31170 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
31180 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
31190 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
311a0 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
311b0 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
311c0 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
311d0 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
311e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
311f0 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
31200 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
31210 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
31220 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
31230 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
31240 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
31250 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
31260 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
31270 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
31280 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+2==pPage->aDa
31290 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
312a0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
312b0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
312c0 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
312d0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
312e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
312f0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
31300 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
31310 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
31320 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
31330 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
31340 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
31350 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
31360 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
31370 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
31380 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
31390 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
313a0 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
313b0 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
313c0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
313d0 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
313e0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
313f0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
31400 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
31410 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
31420 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72  e record is corr
31430 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64  upt, the xRecord
31440 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20  Compare routine 
31450 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20  may read.       
31460 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20     ** up to two 
31470 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65  varints past the
31480 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
31490 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20  er. An extra 18 
314a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
314b0 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69  tes of padding i
314c0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74  s allocated at t
314d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
314e0 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20  ffer in.        
314f0 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68    ** case this h
31500 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20  appens.  */.    
31510 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
31520 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
31530 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
31540 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
31550 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
31560 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  ze;.          pP
31570 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
31580 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
31590 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
315a0 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
315b0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
315c0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
315d0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
315e0 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65  l<0 );   /* True
315f0 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20   if key size is 
31600 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a  2^32 or more */.
31610 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
31620 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20  se( nCell==0 ); 
31630 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
31640 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
31650 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20   0x00 */.       
31660 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
31670 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==1 );  /* Inv
31680 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
31690 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a  0x80 0x80 0x01 *
316a0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
316b0 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29  case( nCell==2 )
316c0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65  ;  /* Minimum le
316d0 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69  gal index key si
316e0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
316f0 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20  if( nCell<2 ){. 
31700 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31710 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
31720 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
31730 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
31740 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
31750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31760 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
31770 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
31780 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
31790 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
317a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
317b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
317c0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
317d0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
317e0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
317f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
31800 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
31810 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
31820 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
31830 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
31840 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
31850 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
31860 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
31870 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
31880 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
31890 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
318a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
318b0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
318c0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
318d0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
318e0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
318f0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
31900 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
31910 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
31920 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
31930 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31940 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
31950 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
31960 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
31970 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
31980 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
31990 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
319a0 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
319b0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
319c0 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
319d0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
319e0 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
319f0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
31a00 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
31a10 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
31a20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
31a30 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
31a40 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
31a50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31a60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31a70 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
31a80 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
31a90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31aa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
31ab0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
31ac0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
31ad0 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
31ae0 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
31af0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
31b00 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
31b10 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
31b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31b30 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
31b40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
31b50 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
31b60 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
31b70 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
31b80 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
31b90 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
31ba0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
31bb0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
31bc0 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
31bd0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
31be0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
31bf0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
31c00 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
31c10 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
31c20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
31c30 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
31c40 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
31c50 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
31c60 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
31c70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
31c80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
31c90 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
31ca0 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
31cb0 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
31cc0 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
31cd0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
31ce0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
31cf0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
31d00 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
31d10 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
31d20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
31d30 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
31d40 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
31d50 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78    }.    pCur->ix
31d60 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
31d70 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
31d80 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
31d90 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
31da0 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
31db0 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
31dc0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
31dd0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
31de0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
31df0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
31e00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
31e10 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
31e20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
31e30 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
31e40 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
31e50 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
31e60 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
31e70 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
31e80 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
31e90 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
31ea0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
31eb0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
31ec0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
31ed0 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
31ee0 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
31ef0 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
31f00 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
31f10 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
31f20 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
31f30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
31f40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
31f50 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
31f60 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
31f70 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
31f80 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
31f90 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
31fa0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
31fb0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
31fc0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
31fd0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
31fe0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
31ff0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
32000 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
32010 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
32020 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
32030 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
32040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
32050 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72   an estimate for
32060 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
32070 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
32080 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
32090 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52   pointing to.  R
320a0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
320b0 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73   number if no es
320c0 74 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e  timate is curren
320d0 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  tly .** availabl
320e0 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  e..*/.i64 sqlite
320f0 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73  3BtreeRowCountEs
32100 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
32110 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38  ){.  i64 n;.  u8
32120 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   i;..  assert( c
32130 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
32140 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
32150 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
32160 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
32170 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
32180 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e   );..  /* Curren
32190 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61  tly this interfa
321a0 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ce is only calle
321b0 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d  d by the OP_IfSm
321c0 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64  aller.  ** opcod
321d0 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63  e, and it that c
321e0 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77  ase the cursor w
321f0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61  ill always be va
32200 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c  lid and.  ** wil
32210 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74  l always point t
32220 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a  o a leaf node. *
32230 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  /.  if( NEVER(pC
32240 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
32250 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75  OR_VALID) ) retu
32260 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56  rn -1;.  if( NEV
32270 45 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ER(pCur->pPage->
32280 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72  leaf==0) ) retur
32290 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75  n -1;..  n = pCu
322a0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b  r->pPage->nCell;
322b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
322c0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
322d0 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e  .    n *= pCur->
322e0 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c  apPage[i]->nCell
322f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
32300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
32310 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
32320 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
32330 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
32340 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75   .** Return valu
32350 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49  e:.**.**    SQLI
32360 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63  TE_OK        suc
32370 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54  cess.**    SQLIT
32380 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73  E_DONE      curs
32390 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
323a0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61  inting at the la
323b0 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20  st element.**   
323c0 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20   otherwise      
323d0 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65    some kind of e
323e0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a  rror occurred.**
323f0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
32400 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
32410 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
32420 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
32430 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
32440 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
32450 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
32460 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
32470 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
32480 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
32490 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
324a0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
324b0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
324c0 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
324d0 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
324e0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
324f0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
32500 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
32510 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
32520 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
32530 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
32540 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
32550 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c   argument in sql
32560 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c  ite3BtreeNext(C,
32570 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68  F) is 1, then th
32580 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72  e.** cursor corr
32590 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
325a0 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73  L index and this
325b0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
325c0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70  ave been.** skip
325d0 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69  ped if the SQL i
325e0 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20  ndex had been a 
325f0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54  unique index.  T
32600 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  he F argument.**
32610 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68   is a hint to th
32620 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51  e implement.  SQ
32630 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
32640 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
32650 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68  ot use.** this h
32660 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
32670 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
32680 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
32690 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
326a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
326b0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
326c0 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
326d0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
326e0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
326f0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
32700 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
32710 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
32720 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
32730 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
32740 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
32750 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
32760 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
32770 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
32780 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
32790 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
327a0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
327b0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
327c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
327d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
327e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
327f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
32800 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
32810 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
32820 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
32830 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
32840 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
32850 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
32860 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
32870 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
32880 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
32890 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
328a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
328b0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
328c0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
328d0 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
328e0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
328f0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
32900 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
32910 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
32920 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
32930 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
32940 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
32950 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
32960 2d 3e 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20  ->ix;.  assert( 
32970 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
32980 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
32990 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
329a0 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
329b0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
329c0 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
329d0 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
329e0 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
329f0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
32a00 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
32a10 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
32a20 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
32a30 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
32a40 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
32a50 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
32a60 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
32a70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
32a80 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
32a90 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
32aa0 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
32ab0 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
32ac0 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
32ad0 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
32ae0 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
32af0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
32b00 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
32b10 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
32b20 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
32b30 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
32b40 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
32b50 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
32b60 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
32b70 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
32b80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
32b90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
32ba0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
32bb0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
32bc0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
32bd0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
32be0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
32bf0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
32c00 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
32c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
32c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32c30 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
32c40 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
32c50 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
32c60 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
32c70 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  >ix>=pPage->nCel
32c80 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
32c90 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
32ca0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
32cb0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
32cc0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
32cd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
32ce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
32cf0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
32d00 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
32d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
32d20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
32d30 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
32d40 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
32d50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
32d60 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
32d70 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  r, int flags){. 
32d80 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
32d90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32da0 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
32db0 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
32dc0 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
32dd0 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65  SQLite */.  asse
32de0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
32df0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
32e00 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
32e10 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
32e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
32e30 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
32e40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
32e50 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
32e60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
32e70 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
32e80 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
32e90 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
32ea0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69  _ValidOvfl);.  i
32eb0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
32ec0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
32ed0 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
32ee0 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20  (pCur);.  pPage 
32ef0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
32f00 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78   if( (++pCur->ix
32f10 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )>=pPage->nCell 
32f20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ){.    pCur->ix-
32f30 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  -;.    return bt
32f40 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20  reeNext(pCur);. 
32f50 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
32f60 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
32f70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
32f80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
32f90 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
32fa0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pCur);.  }.}../
32fb0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
32fc0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
32fd0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
32fe0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
32ff0 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72  tabase..** Retur
33000 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20  n values:.**.** 
33010 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
33020 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20    success.**    
33030 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74   SQLITE_DONE   t
33040 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
33050 65 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73  eady on the firs
33060 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  t element of the
33070 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74   table.**     ot
33080 68 65 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65  herwise     some
33090 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f   kind of error o
330a0 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68  ccurred.**.** Th
330b0 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
330c0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
330d0 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
330e0 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
330f0 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
33100 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
33110 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
33120 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
33130 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
33140 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
33150 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
33160 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
33170 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
33180 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
33190 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
331a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
331b0 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
331c0 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
331d0 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
331e0 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
331f0 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
33200 2a 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66  * If bit 0x01 of
33210 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   the F argument 
33220 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  to sqlite3BtreeP
33230 72 65 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20  revious(C,F) is 
33240 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  1, then.** the c
33250 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
33260 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
33270 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  x and this routi
33280 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
33290 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66  en.** skipped if
332a0 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68   the SQL index h
332b0 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65  ad been a unique
332c0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61   index.  The F a
332d0 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
332e0 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
332f0 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69  ement.  The nati
33300 76 65 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ve SQLite btree 
33310 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
33320 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74  oes not.** use t
33330 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f  his hint, but CO
33340 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  MDB2 does..*/.st
33350 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
33360 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72  LINE int btreePr
33370 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
33380 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
33390 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
333a0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
333b0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
333c0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
333d0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
333e0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
333f0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
33400 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
33410 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
33420 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
33430 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
33440 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
33450 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
33460 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
33470 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
33480 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
33490 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
334a0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
334b0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
334c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
334d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
334e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
334f0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
33500 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
33510 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
33520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
33530 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NE;.    }.    if
33540 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
33550 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
33560 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
33570 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
33580 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
33590 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
335a0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
335b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
335c0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
335d0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
335e0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
335f0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
33600 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
33610 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
33620 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
33630 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
33640 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
33650 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
33660 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
33670 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
33680 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
33690 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
336a0 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  >ix;.    rc = mo
336b0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
336c0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
336d0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
336e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
336f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
33700 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
33710 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
33720 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
33730 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20  r->ix==0 ){.    
33740 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
33750 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
33760 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
33770 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
33780 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
33790 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
337a0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
337b0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
337c0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
337d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
337e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
337f0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
33800 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f  s & (BTCF_ValidO
33810 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
33820 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
33830 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
33840 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Page;.    if( pP
33850 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
33860 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
33870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33880 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
33890 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
338a0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
338b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
338c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
338d0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
338e0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
338f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
33900 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
33910 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
33920 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
33930 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
33940 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a   || flags==1 );.
33950 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
33960 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
33970 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
33980 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55  SOR_VALID );.  U
33990 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
339a0 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
339b0 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
339c0 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
339d0 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75  te */.  pCur->cu
339e0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
339f0 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
33a00 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
33a10 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
33a20 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
33a30 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
33a40 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
33a50 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
33a60 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70  =0.   || pCur->p
33a70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  Page->leaf==0.  
33a80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
33a90 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
33aa0 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  );.  }.  pCur->i
33ab0 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x--;.  return SQ
33ac0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
33ad0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
33ae0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
33af0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
33b00 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
33b10 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
33b20 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
33b30 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
33b40 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
33b50 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
33b60 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
33b70 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
33b80 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
33b90 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
33ba0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
33bb0 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
33bc0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
33bd0 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
33be0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
33bf0 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
33c00 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
33c10 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
33c20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
33c30 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
33c40 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
33c50 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
33c60 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20  or.  *ppPage is 
33c70 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74  set to NULL in t
33c80 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
33c90 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
33ca0 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
33cb0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
33cc0 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
33cd0 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
33ce0 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
33cf0 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
33d00 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
33d10 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
33d20 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
33d30 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
33d40 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
33d50 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
33d60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33d70 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
33d80 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
33d90 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
33da0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
33db0 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
33dc0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
33dd0 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
33de0 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
33df0 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
33e00 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
33e10 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
33e20 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
33e30 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
33e40 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
33e50 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
33e60 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
33e70 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
33e80 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
33e90 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
33ea0 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
33eb0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
33ec0 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
33ed0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
33ee0 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
33ef0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
33f00 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
33f10 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
33f20 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
33f30 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
33f40 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
33f50 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
33f60 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
33f70 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
33f80 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
33f90 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
33fa0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
33fb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
33fc0 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
33fd0 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
33fe0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
33ff0 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
34000 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
34010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34020 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
34030 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
34040 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
34050 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
34060 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
34070 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
34080 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
34090 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
340a0 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
340b0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
340c0 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
340d0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
340e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
340f0 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
34100 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
34110 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
34120 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
34130 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
34140 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
34150 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
34160 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
34170 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
34180 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
34190 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
341a0 79 3e 30 20 26 26 20 52 45 51 55 49 52 45 5f 50  y>0 && REQUIRE_P
341b0 54 52 4d 41 50 20 29 20 29 3b 0a 20 20 70 50 61  TRMAP ) );.  pPa
341c0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
341d0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
341e0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
341f0 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
34200 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36  -OF: R-05119-026
34210 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  37 The 4-byte bi
34220 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
34230 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20   at offset 36.  
34240 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73  ** stores stores
34250 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
34260 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
34270 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20  e freelist. */. 
34280 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
34290 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
342a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
342b0 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
342c0 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
342d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
342e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
342f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  .  }..  /* Ensur
34300 65 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  e page 1 is writ
34310 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
34320 69 6f 6e 20 77 69 6c 6c 20 65 69 74 68 65 72 20  ion will either 
34330 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65  change the numbe
34340 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 73 20  r.  ** of pages 
34350 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
34360 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
34370 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34380 65 2e 20 53 69 6e 63 65 20 62 6f 74 68 0a 20 20  e. Since both.  
34390 2a 2a 20 6f 66 20 74 68 65 73 65 20 6f 70 65 72  ** of these oper
343a0 61 74 69 6f 6e 73 20 69 6e 76 6f 6c 76 65 20 6d  ations involve m
343b0 6f 64 69 66 79 69 6e 67 20 70 61 67 65 20 31 20  odifying page 1 
343c0 68 65 61 64 65 72 20 66 69 65 6c 64 73 2c 20 70  header fields, p
343d0 61 67 65 20 31 0a 20 20 2a 2a 20 77 69 6c 6c 20  age 1.  ** will 
343e0 64 65 66 69 6e 69 74 65 6c 79 20 62 65 20 77 72  definitely be wr
343f0 69 74 74 65 6e 20 62 79 20 74 68 69 73 20 74 72  itten by this tr
34400 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
34410 69 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52  is is an CONCURR
34420 45 4e 54 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ENT.  ** transac
34430 74 69 6f 6e 2c 20 65 6e 73 75 72 65 20 74 68 65  tion, ensure the
34440 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72   BtreePtrmap str
34450 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 20  ucture has been 
34460 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20  allocated.  */. 
34470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34480 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
34490 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
344a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
344b0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
344c0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
344d0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
344e0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
344f0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
34500 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
34510 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
34520 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
34530 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
34540 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
34550 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
34560 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68  .    u32 nSearch
34570 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74   = 0;   /* Count
34580 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
34590 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74  f search attempt
345a0 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  s */.    .    /*
345b0 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
345c0 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
345d0 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
345e0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
345f0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
34600 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
34610 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
34620 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
34630 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
34640 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
34650 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
34660 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
34670 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
34680 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
34690 20 20 20 20 61 73 73 65 72 74 28 20 49 53 41 55      assert( ISAU
346a0 54 4f 56 41 43 55 55 4d 21 3d 49 53 43 4f 4e 43  TOVACUUM!=ISCONC
346b0 55 52 52 45 4e 54 20 29 3b 0a 20 20 20 20 20 20  URRENT );.      
346c0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
346d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
346e0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
346f0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
34700 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
34710 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
34720 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
34730 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
34740 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
34750 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
34760 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
34770 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
34780 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
34790 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
347a0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
347b0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
347c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 61  .            sea
347d0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
347e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
347f0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
34800 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
34810 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
34820 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d      }else if( eM
34830 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
34840 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c  ){.      searchL
34850 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ist = 1;.    }..
34860 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
34870 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
34880 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
34890 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
348a0 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
348b0 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
348c0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
348d0 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
348e0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
348f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
34900 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
34910 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
34920 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
34930 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
34940 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
34950 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
34960 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
34970 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
34980 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
34990 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
349a0 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
349b0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
349c0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
349d0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
349e0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
349f0 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
34a00 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
34a10 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
34a20 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
34a30 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
34a40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
34a50 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
34a60 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
34a70 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
34a80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
34a90 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
34aa0 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
34ab0 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
34ac0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
34ad0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
34ae0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
34af0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
34b00 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
34b10 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
34b20 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
34b30 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
34b40 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
34b50 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
34b60 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
34b70 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
34b80 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
34b90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34ba0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
34bb0 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
34bc0 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
34bd0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
34be0 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
34bf0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
34c00 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
34c10 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
34c20 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
34c30 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
34c40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
34c50 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
34c60 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
34c70 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
34c80 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
34c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34ca0 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
34cb0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
34cc0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
34cd0 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
34ce0 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
34cf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
34d00 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72  UPT_PGNO(pPrevTr
34d10 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b  unk ? pPrevTrunk
34d20 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20  ->pgno : 1);.   
34d30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d40 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
34d50 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
34d60 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
34d70 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
34d80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
34d90 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
34da0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
34db0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
34dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
34dd0 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
34de0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
34df0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
34e00 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
34e10 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
34e20 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
34e30 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
34e40 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
34e50 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
34e60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
34e70 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
34e80 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
34e90 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
34ea0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
34eb0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
34ec0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
34ed0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
34ee0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
34ef0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
34f00 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
34f10 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
34f20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
34f30 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
34f40 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
34f50 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
34f60 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
34f70 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
34f80 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
34f90 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
34fa0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
34fb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34fc0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
34fd0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
34fe0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
34ff0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
35000 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
35010 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
35020 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
35030 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
35040 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
35050 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
35060 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
35070 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
35080 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
35090 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
350a0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
350b0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
350c0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
350d0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
350e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
350f0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
35100 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
35110 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
35120 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
35130 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
35140 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
35150 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35160 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
35170 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
35180 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
35190 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
351a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
351b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
351c0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
351d0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
351e0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
351f0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
35200 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
35210 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
35220 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
35230 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
35240 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
35250 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
35260 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
35270 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
35280 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
35290 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
352a0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
352b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
352c0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
352d0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
352e0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
352f0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
35300 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35310 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
35320 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
35330 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
35340 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
35350 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
35360 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
35370 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
35380 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
35390 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
353a0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
353b0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
353c0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
353d0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
353e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
353f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35400 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35410 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
35420 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35430 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35450 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
35460 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
35470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35480 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
35490 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
354a0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
354b0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
354c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
354d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
354e0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
354f0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
35500 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
35510 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
35520 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
35530 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
35540 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
35550 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
35560 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
35570 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
35580 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
35590 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
355a0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
355b0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
355c0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
355d0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
355e0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
355f0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
35600 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
35610 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
35620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
35630 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
35640 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
35650 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
35660 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35670 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35680 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
35690 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
356a0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
356b0 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
356c0 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
356d0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
356e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
356f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
35700 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
35710 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
35720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35740 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
35750 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
35760 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
35770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35780 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
35790 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
357a0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
357b0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
357c0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
357d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
357e0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
357f0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
35800 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
35810 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
35820 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
35830 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
35840 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
35850 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
35860 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
35870 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
35880 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
35890 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
358a0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
358b0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
358c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
358d0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
358e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
358f0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
35900 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
35910 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
35920 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
35930 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
35940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35960 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
35970 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
35980 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
35990 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
359a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
359b0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
359c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
359d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
359e0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
359f0 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
35a00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35a20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
35a30 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
35a40 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
35a50 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
35a60 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
35a70 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
35a80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
35a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
35aa0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
35ab0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
35ac0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
35ad0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
35ae0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
35af0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
35b00 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
35b10 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
35b20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
35b30 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
35b40 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
35b50 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
35b60 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
35b70 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
35b80 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
35b90 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
35ba0 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
35bb0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
35bc0 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
35bd0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
35be0 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
35bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
35c00 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
35c10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
35c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
35c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
35c40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
35c50 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
35c60 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
35c70 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
35c80 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
35c90 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
35ca0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
35cb0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
35cc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
35cd0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
35ce0 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
35cf0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
35d00 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
35d10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
35d20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
35d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
35d40 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
35d50 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
35d60 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
35d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
35d90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35da0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
35db0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
35dc0 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
35dd0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
35de0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
35df0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
35e00 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
35e10 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
35e20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
35e30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
35e40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
35e50 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
35e60 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
35e70 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
35e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35e90 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
35ea0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
35eb0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
35ec0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
35ed0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
35ee0 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
35ef0 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
35f00 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
35f10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
35f20 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
35f30 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
35f40 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
35f50 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
35f60 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
35f70 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
35f80 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
35f90 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
35fa0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
35fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fc0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
35fd0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
35fe0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
35ff0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36000 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
36010 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
36020 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
36030 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
36040 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
36050 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
36060 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
36070 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
36080 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
36090 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
360a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
360b0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
360c0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
360d0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
360e0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
360f0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
36100 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
36110 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
36120 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
36130 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
36140 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
36150 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
36160 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
36170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36190 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
361a0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
361b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
361c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
361d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
361e0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
361f0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
36200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
36210 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
36220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
36240 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
36250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36260 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
36270 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
36280 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
36290 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
362a0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
362b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
362c0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
362d0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
362e0 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
362f0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
36300 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
36310 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
36320 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
36330 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
36340 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
36350 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
36360 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
36370 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
36380 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
36390 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
363a0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
363b0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
363c0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
363d0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
363e0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
363f0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
36400 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
36410 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
36420 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
36430 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
36440 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
36450 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
36460 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
36470 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
36480 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
36490 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
364a0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
364b0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
364c0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
364d0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
364e0 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
364f0 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
36500 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
36510 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
36520 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
36530 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
36540 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
36550 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
36560 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
36570 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
36580 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
36590 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
365a0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
365b0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
365c0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
365d0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
365e0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
365f0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
36600 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
36610 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
36620 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
36630 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
36640 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
36650 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
36660 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
36670 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
36680 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
36690 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
366a0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
366b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
366c0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
366d0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
366e0 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
366f0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
36700 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
36710 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
36720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36730 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
36740 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
36750 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
36760 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
36770 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
36780 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
36790 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
367a0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
367b0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
367c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
367d0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
367e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
367f0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
36800 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
36810 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
36820 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
36830 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
36840 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
36850 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
36860 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
36870 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
36880 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
36890 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
368a0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
368b0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
368c0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
368d0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
368e0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
368f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
36900 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
36910 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
36920 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
36930 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
36940 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
36950 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
36960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
36970 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
36980 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36990 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
369a0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
369b0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
369c0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
369d0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
369e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
369f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
36a00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36a10 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
36a20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
36a30 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
36a40 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
36a50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36a60 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
36a70 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
36a80 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
36a90 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
36aa0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
36ab0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
36ac0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
36ad0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
36ae0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
36af0 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
36b00 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
36b10 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
36b20 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
36b30 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
36b40 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
36b50 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
36b60 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
36b70 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
36b80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36b90 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
36ba0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
36bb0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
36bc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36bd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36be0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
36bf0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
36c00 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
36c10 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
36c20 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
36c30 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
36c40 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
36c50 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
36c60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
36c70 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
36c80 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
36c90 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
36ca0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
36cb0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
36cc0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
36cd0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
36ce0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
36cf0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
36d00 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
36d10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
36d20 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
36d30 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
36d40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36d50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
36d60 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
36d70 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
36d80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
36d90 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
36da0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
36db0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
36dc0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
36dd0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
36de0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
36df0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
36e00 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
36e10 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
36e20 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
36e30 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
36e40 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
36e50 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
36e60 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
36e70 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
36e80 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
36e90 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
36ea0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
36eb0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
36ec0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
36ed0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
36ee0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
36ef0 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
36f00 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
36f10 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
36f20 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
36f30 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
36f40 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
36f50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
36f60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
36f70 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
36f80 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
36f90 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
36fa0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
36fb0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
36fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36fd0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
36fe0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
36ff0 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
37000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37010 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
37020 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
37030 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
37040 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
37050 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
37060 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
37070 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
37080 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
37090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
370a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
370b0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
370c0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
370d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
370e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370f0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
37100 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
37110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37120 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
37130 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
37140 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
37150 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
37160 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
37170 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
37180 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
37190 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
371a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
371b0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
371c0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
371d0 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
371e0 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
371f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
37200 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
37210 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
37220 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
37230 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
37240 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
37250 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
37260 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
37270 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
37280 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
37290 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
372a0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
372b0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
372c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
372d0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
372e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
372f0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
37300 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
37310 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
37320 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
37330 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
37340 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
37350 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
37360 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
37370 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
37380 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
37390 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
373a0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
373b0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
373c0 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
373d0 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
373e0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
373f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
37400 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
37410 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
37420 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
37430 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
37440 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
37450 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37460 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
37470 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
37480 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
37490 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
374a0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
374b0 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
374c0 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
374d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
374e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
374f0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
37500 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
37510 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
37520 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
37530 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
37540 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
37550 2f 0a 20 20 69 66 28 20 52 45 51 55 49 52 45 5f  /.  if( REQUIRE_
37560 50 54 52 4d 41 50 20 29 7b 0a 20 20 20 20 70 74  PTRMAP ){.    pt
37570 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
37580 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
37590 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
375a0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
375b0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
375c0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
375d0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
375e0 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
375f0 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
37600 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
37610 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
37620 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
37630 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
37640 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
37650 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
37660 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
37670 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
37680 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
37690 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
376a0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
376b0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
376c0 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
376d0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
376e0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
376f0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
37700 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
37710 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
37720 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
37730 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
37740 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
37750 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
37760 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
37770 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
37780 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
37790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
377a0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
377b0 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
377c0 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
377d0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
377e0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
377f0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
37800 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
37810 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
37820 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
37830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37840 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
37850 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
37860 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
37870 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
37880 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
37890 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
378a0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
378b0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
378c0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
378d0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
378e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
378f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
37900 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
37910 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
37920 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
37930 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
37940 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
37950 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
37960 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
37970 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
37980 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
37990 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
379a0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
379b0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
379c0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
379d0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
379e0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
379f0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
37a00 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
37a10 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
37a20 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
37a30 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
37a40 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
37a50 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
37a60 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
37a70 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
37a80 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
37a90 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
37aa0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
37ab0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
37ac0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
37ad0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
37ae0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
37af0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
37b00 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
37b10 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
37b20 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
37b30 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
37b40 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
37b50 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
37b60 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
37b70 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
37b80 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
37b90 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
37ba0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
37bb0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
37bc0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
37bd0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
37be0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
37bf0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
37c00 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
37c10 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
37c20 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
37c30 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
37c40 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
37c50 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
37c60 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
37c70 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
37c80 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
37c90 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
37ca0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
37cb0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
37cc0 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
37cd0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
37ce0 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
37cf0 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
37d00 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
37d10 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
37d20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
37d30 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
37d40 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
37d50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
37d60 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
37d70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
37d80 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
37d90 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
37da0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
37db0 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
37dc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37dd0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
37de0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
37df0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37e00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37e10 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
37e20 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
37e30 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
37e40 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
37e50 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
37e60 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
37e70 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
37e80 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
37e90 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
37ea0 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
37eb0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
37ec0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
37ed0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
37ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
37ef0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
37f00 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
37f10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37f20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
37f30 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
37f40 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
37f50 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
37f60 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
37f70 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
37f80 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
37f90 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
37fa0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
37fb0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
37fc0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
37fd0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
37fe0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
37ff0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
38000 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
38010 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
38020 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
38030 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
38040 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
38050 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
38060 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
38070 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
38080 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
38090 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
380a0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
380b0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
380c0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
380d0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
380e0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
380f0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
38100 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
38110 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
38120 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
38130 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
38140 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
38150 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
38160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
38170 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
38180 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
38190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
381a0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
381b0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
381c0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
381d0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
381e0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
381f0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
38200 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
38210 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
38220 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
38230 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
38240 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
38250 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
38260 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
38270 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
38280 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
38290 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
382a0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
382b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
382c0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
382d0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
382e0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
382f0 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
38300 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
38310 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
38320 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
38330 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
38340 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
38350 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
38360 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
38370 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
38380 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
38390 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
383a0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
383b0 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69   Store.** size i
383c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
383d0 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e   the cell in pIn
383e0 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  fo..*/.static in
383f0 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d  t clearCell(.  M
38400 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
38410 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
38420 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
38430 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  s the Cell */.  
38440 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
38450 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73  Cell,    /* Firs
38460 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65  t byte of the Ce
38470 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  ll */.  CellInfo
38480 20 2a 70 49 6