/ Hex Artifact Content
Login

Artifact c3e15a9e5726fa3f426322cccaf9fe972dc9b3d9e07921220286f9076413f71d:


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 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
1fc0: 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20  to see if Btree 
1fd0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
1fe0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
1ff0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
2000: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
2010: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
2020: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2030: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
2040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
2050: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
2060: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
2070: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
2080: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2090: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
20a0: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
20b0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
20c0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20d0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
20e0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
20f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2100: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2110: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2130: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2140: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2150: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2160: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2170: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2180: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2190: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
21a0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
21b0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c  _ReadUncommit)||
21c0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
21d0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
21e0: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
21f0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2200: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2210: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2220: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2230: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2240: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2250: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2260: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2270: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
2280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
2290: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
22a0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
22b0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
22c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
22d0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
22e0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
22f0: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2300: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2310: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2340: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2350: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2360: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2370: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
2380: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
2390: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
23a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
23c0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
23d0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
23e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23f0: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2400: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2410: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2430: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2440: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2450: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2470: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2480: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2490: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
24a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
24b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
24c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
24d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
24e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
24f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2500: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2510: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2520: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2530: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2540: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2550: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2560: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2570: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2580: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
25b0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
25c0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
25d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
25e0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
25f0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2600: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2610: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2620: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2630: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2640: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2650: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2670: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2680: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2690: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
26a0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
26b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
26c0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
26d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
26e0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
26f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2700: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2710: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2720: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2730: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2750: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2760: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2770: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2780: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2790: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
27a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
27b0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
27c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
27d0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
27e0: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
27f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2810: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2830: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2850: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2870: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2880: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
2890: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
28a0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
28b0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
28c0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
28d0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
28e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
28f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2900: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2910: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2920: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2940: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2950: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2960: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2970: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
2980: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
2990: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
29a0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
29b0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
29c0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
29d0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
29e0: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
29f0: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2a00: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2a10: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2a20: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2a30: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2a40: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2a50: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2a60: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2a70: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
2a80: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
2a90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
2ab0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
2ac0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
2ad0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2ae0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2af0: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2b10: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2b20: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2b30: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2b40: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2b50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b60: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2b70: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2b80: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2b90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ba0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2bb0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2bc0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2bd0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2bf0: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2c10: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2c20: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2c30: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2c40: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2c50: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2c60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2c70: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2c80: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2c90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2ca0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2cb0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2cc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2cd0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2ce0: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2cf0: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2d00: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2d10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2d20: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2d30: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20  E_ReadUncommit) 
2d40: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2d50: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
2d60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2d70: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2d80: 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20  d on a sharable 
2d90: 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20  b-tree after it 
2da0: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64  .  ** has been d
2db0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
2dc0: 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68  o other b-tree h
2dd0: 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69  olds a conflicti
2de0: 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  ng lock.  */.  a
2df0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
2e00: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
2e20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2e30: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
2e40: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
2e50: 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65  First search the
2e60: 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69   list for an exi
2e70: 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68  sting lock on th
2e80: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
2e90: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
2ea0: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
2eb0: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
2ec0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2ed0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
2ee0: 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d  & pIter->pBtree=
2ef0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =p ){.      pLoc
2f00: 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20  k = pIter;.     
2f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
2f30: 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20  bove search did 
2f40: 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63  not find a BtLoc
2f50: 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61  k struct associa
2f60: 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a  ting Btree p.  *
2f70: 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61  * with table iTa
2f80: 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e  ble, allocate on
2f90: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
2fa0: 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a  to the list..  *
2fb0: 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  /.  if( !pLock )
2fc0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42  {.    pLock = (B
2fd0: 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d  tLock *)sqlite3M
2fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
2ff0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
3000: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
3010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3020: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
3030: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3040: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3050: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3060: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3070: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3080: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3090: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
30a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3100: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3110: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3120: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3130: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3140: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3150: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3160: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3170: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3180: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3190: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
31a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3210: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3220: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3230: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3240: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3250: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3260: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3270: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3280: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3290: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
32a0: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32e0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32f0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
3300: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3310: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3320: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3330: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3340: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3350: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3360: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3370: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3380: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3390: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33b0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33c0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33f0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
3400: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3410: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3420: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3430: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3440: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3450: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3460: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3470: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3480: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3490: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
34a0: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34b0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34c0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34d0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34e0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34f0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
3500: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3510: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3520: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3530: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3540: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3550: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3560: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3570: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3590: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
35a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35e0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35f0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
3600: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3610: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3620: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3630: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3640: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3650: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3660: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3670: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3680: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3690: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
36a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36c0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36d0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36f0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
3700: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3710: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3720: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3730: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3740: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3760: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3770: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3780: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3790: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
37a0: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37b0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37c0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37e0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37f0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
3800: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3810: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3820: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3830: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3840: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3850: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3860: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3870: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
38a0: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38b0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38c0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3900: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3910: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3920: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3930: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3940: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3950: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3960: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3980: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3990: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
39a0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39c0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39f0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3a00: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a10: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a20: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a30: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a60: 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
3a70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
3a80: 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65  URRENT./*.** The
3a90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3aa0: 74 75 72 65 20 2d 20 42 74 72 65 65 50 74 72 6d  ture - BtreePtrm
3ab0: 61 70 20 2d 20 73 74 6f 72 65 73 20 74 68 65 20  ap - stores the 
3ac0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  in-memory pointe
3ad0: 72 20 6d 61 70 0a 2a 2a 20 75 73 65 64 20 66 6f  r map.** used fo
3ae0: 72 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  r newly allocate
3af0: 64 20 70 61 67 65 73 20 69 6e 20 43 4f 4e 43 55  d pages in CONCU
3b00: 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
3b10: 6e 73 2e 20 53 75 63 68 20 70 61 67 65 73 20 61  ns. Such pages a
3b20: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 61 6c 6c  re.** always all
3b30: 6f 63 61 74 65 64 20 69 6e 20 61 20 63 6f 6e 74  ocated in a cont
3b40: 69 67 75 6f 75 73 20 62 6c 6f 63 6b 20 28 66 72  iguous block (fr
3b50: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
3b60: 65 20 66 69 6c 65 29 20 73 74 61 72 74 69 6e 67  e file) starting
3b70: 0a 2a 2a 20 77 69 74 68 20 70 61 67 65 20 42 74  .** with page Bt
3b80: 72 65 65 50 74 72 6d 61 70 2e 69 46 69 72 73 74  reePtrmap.iFirst
3b90: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
3ba0: 75 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72  uct RollbackEntr
3bb0: 79 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 3b  y RollbackEntry;
3bc0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3bd0: 50 74 72 6d 61 70 45 6e 74 72 79 20 50 74 72 6d  PtrmapEntry Ptrm
3be0: 61 70 45 6e 74 72 79 3b 0a 73 74 72 75 63 74 20  apEntry;.struct 
3bf0: 50 74 72 6d 61 70 45 6e 74 72 79 20 7b 0a 20 20  PtrmapEntry {.  
3c00: 50 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75  Pgno parent;.  u
3c10: 38 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75  8 eType;.};.stru
3c20: 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79  ct RollbackEntry
3c30: 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a   {.  Pgno pgno;.
3c40: 20 20 50 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20    Pgno parent;. 
3c50: 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74   u8 eType;.};.st
3c60: 72 75 63 74 20 42 74 72 65 65 50 74 72 6d 61 70  ruct BtreePtrmap
3c70: 20 7b 0a 20 20 50 67 6e 6f 20 69 46 69 72 73 74   {.  Pgno iFirst
3c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c90: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e 65       /* First ne
3ca0: 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 50  w page number aP
3cb0: 74 72 5b 30 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20  tr[0] */..  int 
3cc0: 6e 50 74 72 41 6c 6c 6f 63 3b 20 20 20 20 20 20  nPtrAlloc;      
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3ce0: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
3cf0: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f   aPtr[] array */
3d00: 0a 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20 2a  .  PtrmapEntry *
3d10: 61 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  aPtr;           
3d20: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70     /* Array of p
3d30: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
3d40: 72 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 76  rs */..  int nSv
3d50: 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pt;             
3d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
3d70: 20 73 69 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d   size of aSvpt[]
3d80: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
3d90: 6e 53 76 70 74 41 6c 6c 6f 63 3b 20 20 20 20 20  nSvptAlloc;     
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3db0: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
3dc0: 20 61 53 76 70 74 5b 5d 20 2a 2f 0a 20 20 69 6e   aSvpt[] */.  in
3dd0: 74 20 2a 61 53 76 70 74 3b 20 20 20 20 20 20 20  t *aSvpt;       
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3df0: 20 46 69 72 73 74 20 61 52 6f 6c 6c 62 61 63 6b   First aRollback
3e00: 5b 5d 20 65 6e 74 72 79 20 66 6f 72 20 73 61 76  [] entry for sav
3e10: 65 70 6f 69 6e 74 20 69 20 2a 2f 0a 0a 20 20 69  epoint i */..  i
3e20: 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  nt nRollback;   
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e40: 2a 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61  * Used size of a
3e50: 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79  Rollback[] array
3e60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62   */.  int nRollb
3e70: 61 63 6b 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  ackAlloc;       
3e80: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
3e90: 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 6c 6c  ed size of aRoll
3ea0: 62 61 63 6b 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  back[] array */.
3eb0: 20 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20    RollbackEntry 
3ec0: 2a 61 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  *aRollback;     
3ed0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f    /* Array of ro
3ee0: 6c 6c 62 61 63 6b 20 65 6e 74 72 69 65 73 20 2a  llback entries *
3ef0: 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64 65 66 69 6e 65  /.};../* !define
3f00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
3f10: 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20  NCURRENT).**.** 
3f20: 49 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  If page number p
3f30: 67 6e 6f 20 69 73 20 67 72 65 61 74 65 72 20 74  gno is greater t
3f40: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
3f50: 42 74 72 65 65 50 74 72 6d 61 70 2e 69 46 69 72  BtreePtrmap.iFir
3f60: 73 74 2c 20 0a 2a 2a 20 73 74 6f 72 65 20 61 6e  st, .** store an
3f70: 20 65 6e 74 72 79 20 66 6f 72 20 69 74 20 69 6e   entry for it in
3f80: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
3f90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3fa0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50  tatic int btreeP
3fb0: 74 72 6d 61 70 53 74 6f 72 65 28 0a 20 20 42 74  trmapStore(.  Bt
3fc0: 53 68 61 72 65 64 20 2a 70 42 74 2c 0a 20 20 50  Shared *pBt,.  P
3fd0: 67 6e 6f 20 70 67 6e 6f 2c 0a 20 20 75 38 20 65  gno pgno,.  u8 e
3fe0: 54 79 70 65 2c 20 0a 20 20 50 67 6e 6f 20 70 61  Type, .  Pgno pa
3ff0: 72 65 6e 74 0a 29 7b 0a 20 20 42 74 72 65 65 50  rent.){.  BtreeP
4000: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4010: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4020: 67 6e 6f 3e 3d 70 4d 61 70 2d 3e 69 46 69 72 73  gno>=pMap->iFirs
4030: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 6e  t ){.    int iEn
4040: 74 72 79 20 3d 20 70 67 6e 6f 20 2d 20 70 4d 61  try = pgno - pMa
4050: 70 2d 3e 69 46 69 72 73 74 3b 0a 0a 20 20 20 20  p->iFirst;..    
4060: 2f 2a 20 47 72 6f 77 20 74 68 65 20 61 50 74 72  /* Grow the aPtr
4070: 5b 5d 20 61 72 72 61 79 20 61 73 20 72 65 71 75  [] array as requ
4080: 69 72 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c  ired */.    whil
4090: 65 28 20 69 45 6e 74 72 79 3e 3d 70 4d 61 70 2d  e( iEntry>=pMap-
40a0: 3e 6e 50 74 72 41 6c 6c 6f 63 20 29 7b 0a 20 20  >nPtrAlloc ){.  
40b0: 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70      int nNew = p
40c0: 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3f  Map->nPtrAlloc ?
40d0: 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63   pMap->nPtrAlloc
40e0: 2a 32 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 50  *2 : 16;.      P
40f0: 74 72 6d 61 70 45 6e 74 72 79 20 2a 61 4e 65 77  trmapEntry *aNew
4100: 20 3d 20 28 50 74 72 6d 61 70 45 6e 74 72 79 2a   = (PtrmapEntry*
4110: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
4120: 28 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 70  (.          pMap
4130: 2d 3e 61 50 74 72 2c 20 6e 4e 65 77 2a 73 69 7a  ->aPtr, nNew*siz
4140: 65 6f 66 28 50 74 72 6d 61 70 45 6e 74 72 79 29  eof(PtrmapEntry)
4150: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
4160: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
4170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4180: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
41a0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 4e   int nByte = (nN
41b0: 65 77 2d 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew-pMap->nPtrAll
41c0: 6f 63 29 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61  oc)*sizeof(Ptrma
41d0: 70 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 20  pEntry);.       
41e0: 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4d   memset(&aNew[pM
41f0: 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 5d 2c 20  ap->nPtrAlloc], 
4200: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
4210: 20 20 20 70 4d 61 70 2d 3e 61 50 74 72 20 3d 20     pMap->aPtr = 
4220: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4230: 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3d 20  ap->nPtrAlloc = 
4240: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nNew;.      }.  
4250: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
4260: 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
4270: 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 69 66 20  rollback log if 
4280: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
4290: 69 66 28 20 70 4d 61 70 2d 3e 6e 53 76 70 74 3e  if( pMap->nSvpt>
42a0: 30 20 26 26 20 70 4d 61 70 2d 3e 61 50 74 72 5b  0 && pMap->aPtr[
42b0: 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 20 29  iEntry].parent )
42c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 61 70  {.      if( pMap
42d0: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 3e 3d 70 4d 61  ->nRollback>=pMa
42e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f  p->nRollbackAllo
42f0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  c ){.        int
4300: 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 52   nNew = pMap->nR
4310: 6f 6c 6c 62 61 63 6b 20 3f 20 70 4d 61 70 2d 3e  ollback ? pMap->
4320: 6e 52 6f 6c 6c 62 61 63 6b 2a 32 20 3a 20 31 36  nRollback*2 : 16
4330: 3b 0a 20 20 20 20 20 20 20 20 52 6f 6c 6c 62 61  ;.        Rollba
4340: 63 6b 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20  ckEntry *aNew = 
4350: 28 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 2a 29  (RollbackEntry*)
4360: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
4370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61  .            pMa
4380: 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 2c 20 6e 4e  p->aRollback, nN
4390: 65 77 2a 73 69 7a 65 6f 66 28 52 6f 6c 6c 62 61  ew*sizeof(Rollba
43a0: 63 6b 45 6e 74 72 79 29 0a 20 20 20 20 20 20 20  ckEntry).       
43b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
43c0: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
43d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
43e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
43f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4400: 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61     pMap->aRollba
4410: 63 6b 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ck = aNew;.     
4420: 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c       pMap->nRoll
4430: 62 61 63 6b 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77  backAlloc = nNew
4440: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4450: 20 20 7d 0a 0a 20 20 20 20 20 20 70 4d 61 70 2d    }..      pMap-
4460: 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d  >aRollback[pMap-
4470: 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 67 6e 6f  >nRollback].pgno
4480: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70   = pgno;.      p
4490: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
44a0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
44b0: 70 61 72 65 6e 74 20 3d 20 70 4d 61 70 2d 3e 61  parent = pMap->a
44c0: 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65  Ptr[iEntry].pare
44d0: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e  nt;.      pMap->
44e0: 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e  aRollback[pMap->
44f0: 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 65 54 79 70 65  nRollback].eType
4500: 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45   = pMap->aPtr[iE
4510: 6e 74 72 79 5d 2e 65 54 79 70 65 3b 0a 20 20 20  ntry].eType;.   
4520: 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61     pMap->nRollba
4530: 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ck++;.    }..   
4540: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
4550: 50 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Ptr[] array */. 
4560: 20 20 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45     pMap->aPtr[iE
4570: 6e 74 72 79 5d 2e 70 61 72 65 6e 74 20 3d 20 70  ntry].parent = p
4580: 61 72 65 6e 74 3b 0a 20 20 20 20 70 4d 61 70 2d  arent;.    pMap-
4590: 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54  >aPtr[iEntry].eT
45a0: 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 7d  ype = eType;.  }
45b0: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
45c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66  E_OK;.}../* !def
45d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
45e0: 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a  _CONCURRENT).**.
45f0: 2a 2a 20 4f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** Open savepoin
4600: 74 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 69 66  t iSavepoint, if
4610: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
4620: 64 79 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  dy open..*/.stat
4630: 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d  ic int btreePtrm
4640: 61 70 42 65 67 69 6e 28 42 74 53 68 61 72 65 64  apBegin(BtShared
4650: 20 2a 70 42 74 2c 20 69 6e 74 20 6e 53 76 70 74   *pBt, int nSvpt
4660: 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  ){.  BtreePtrmap
4670: 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
4680: 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 26  ap;.  if( pMap &
4690: 26 20 6e 53 76 70 74 3e 70 4d 61 70 2d 3e 6e 53  & nSvpt>pMap->nS
46a0: 76 70 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  vpt ){.    int i
46b0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 76 70 74 3e  ;.    if( nSvpt>
46c0: 3d 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f  =pMap->nSvptAllo
46d0: 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  c ){.      int n
46e0: 4e 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 53 76 70  New = pMap->nSvp
46f0: 74 41 6c 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e  tAlloc ? pMap->n
4700: 53 76 70 74 41 6c 6c 6f 63 2a 32 20 3a 20 31 36  SvptAlloc*2 : 16
4710: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65  ;.      int *aNe
4720: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
4730: 6c 6f 63 28 70 4d 61 70 2d 3e 61 53 76 70 74 2c  loc(pMap->aSvpt,
4740: 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 6e   sizeof(int) * n
4750: 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
4760: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
4770: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4780: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
4790: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 61  lse{.        pMa
47a0: 70 2d 3e 61 53 76 70 74 20 3d 20 61 4e 65 77 3b  p->aSvpt = aNew;
47b0: 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e  .        pMap->n
47c0: 53 76 70 74 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77  SvptAlloc = nNew
47d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
47e0: 0a 20 20 20 20 66 6f 72 28 69 3d 70 4d 61 70 2d  .    for(i=pMap-
47f0: 3e 6e 53 76 70 74 3b 20 69 3c 6e 53 76 70 74 3b  >nSvpt; i<nSvpt;
4800: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d 61   i++){.      pMa
4810: 70 2d 3e 61 53 76 70 74 5b 69 5d 20 3d 20 70 4d  p->aSvpt[i] = pM
4820: 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 3b 0a 20  ap->nRollback;. 
4830: 20 20 20 7d 0a 20 20 20 20 70 4d 61 70 2d 3e 6e     }.    pMap->n
4840: 53 76 70 74 20 3d 20 6e 53 76 70 74 3b 0a 20 20  Svpt = nSvpt;.  
4850: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
4860: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65  TE_OK;.}../* !de
4870: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4880: 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a  T_CONCURRENT).**
4890: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 28 69 66  .** Rollback (if
48a0: 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
48b0: 4f 4c 4c 42 41 43 4b 29 20 6f 72 20 72 65 6c 65  OLLBACK) or rele
48c0: 61 73 65 20 28 69 66 20 6f 70 3d 3d 53 41 56 45  ase (if op==SAVE
48d0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 0a 2a  POINT_RELEASE).*
48e0: 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 53 76 70  * savepoint iSvp
48f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4900: 64 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e 64  d btreePtrmapEnd
4910: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4920: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 76 70  int op, int iSvp
4930: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
4940: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
4950: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
4960: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ){.    assert( o
4970: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
4980: 4c 42 41 43 4b 20 7c 7c 20 6f 70 3d 3d 53 41 56  LBACK || op==SAV
4990: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
49a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
49b0: 76 70 74 3e 3d 30 20 7c 7c 20 28 69 53 76 70 74  vpt>=0 || (iSvpt
49c0: 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
49d0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
49e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 53 76 70 74  );.    if( iSvpt
49f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4d 61 70  <0 ){.      pMap
4a00: 2d 3e 6e 53 76 70 74 20 3d 20 30 3b 0a 20 20 20  ->nSvpt = 0;.   
4a10: 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61     pMap->nRollba
4a20: 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  ck = 0;.      me
4a30: 6d 73 65 74 28 70 4d 61 70 2d 3e 61 50 74 72 2c  mset(pMap->aPtr,
4a40: 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29   0, sizeof(Pgno)
4a50: 20 2a 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c   * pMap->nPtrAll
4a60: 6f 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oc);.    }else i
4a70: 66 28 20 69 53 76 70 74 3c 70 4d 61 70 2d 3e 6e  f( iSvpt<pMap->n
4a80: 53 76 70 74 20 29 7b 0a 20 20 20 20 20 20 69 66  Svpt ){.      if
4a90: 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
4aa0: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
4ab0: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
4ac0: 20 20 20 20 66 6f 72 28 69 69 3d 70 4d 61 70 2d      for(ii=pMap-
4ad0: 3e 6e 52 6f 6c 6c 62 61 63 6b 2d 31 3b 20 69 69  >nRollback-1; ii
4ae0: 3e 3d 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53  >=pMap->aSvpt[iS
4af0: 76 70 74 5d 3b 20 69 69 2d 2d 29 7b 0a 20 20 20  vpt]; ii--){.   
4b00: 20 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45         RollbackE
4b10: 6e 74 72 79 20 2a 70 20 3d 20 26 70 4d 61 70 2d  ntry *p = &pMap-
4b20: 3e 61 52 6f 6c 6c 62 61 63 6b 5b 69 69 5d 3b 0a  >aRollback[ii];.
4b30: 20 20 20 20 20 20 20 20 20 20 50 74 72 6d 61 70            Ptrmap
4b40: 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 20 3d 20  Entry *pEntry = 
4b50: 26 70 4d 61 70 2d 3e 61 50 74 72 5b 70 2d 3e 70  &pMap->aPtr[p->p
4b60: 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72  gno - pMap->iFir
4b70: 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  st];.          p
4b80: 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 20 3d 20  Entry->parent = 
4b90: 70 2d 3e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20  p->parent;.     
4ba0: 20 20 20 20 20 70 45 6e 74 72 79 2d 3e 65 54 79       pEntry->eTy
4bb0: 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20  pe = p->eType;. 
4bc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4bd0: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76  .      pMap->nSv
4be0: 70 74 20 3d 20 69 53 76 70 74 20 2b 20 28 6f 70  pt = iSvpt + (op
4bf0: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
4c00: 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 70 4d 61  BACK);.      pMa
4c10: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3d 20 70  p->nRollback = p
4c20: 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53 76 70 74  Map->aSvpt[iSvpt
4c30: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  ];.    }.  }.}..
4c40: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
4c50: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
4c60: 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  NT).**.** This f
4c70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4c80: 64 20 61 66 74 65 72 20 61 6e 20 43 4f 4e 43 55  d after an CONCU
4c90: 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
4ca0: 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  n is opened on t
4cb0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
4cc0: 49 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  It allocates the
4cd0: 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72   BtreePtrmap str
4ce0: 75 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 74  ucture used to t
4cf0: 72 61 63 6b 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  rack pointers.**
4d00: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   to allocated pa
4d10: 67 65 73 20 61 6e 64 20 7a 65 72 6f 65 73 20 74  ges and zeroes t
4d20: 68 65 20 6e 46 72 65 65 2f 69 54 72 75 6e 6b 20  he nFree/iTrunk 
4d30: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 64 61  fields in the da
4d40: 74 61 62 61 73 65 20 0a 2a 2a 20 68 65 61 64 65  tabase .** heade
4d50: 72 20 6f 6e 20 70 61 67 65 20 31 2e 0a 2a 2f 0a  r on page 1..*/.
4d60: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4d70: 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 42  PtrmapAllocate(B
4d80: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
4d90: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4da0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  _OK;.  if( pBt->
4db0: 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 42  pMap==0 ){.    B
4dc0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
4dd0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
4de0: 63 28 73 69 7a 65 6f 66 28 42 74 72 65 65 50 74  c(sizeof(BtreePt
4df0: 72 6d 61 70 29 29 3b 0a 20 20 20 20 69 66 28 20  rmap));.    if( 
4e00: 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pMap==0 ){.     
4e10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4e20: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
4e30: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 42 74       memset(&pBt
4e40: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
4e50: 33 32 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  32], 0, sizeof(u
4e60: 33 32 29 2a 32 29 3b 0a 20 20 20 20 20 20 6d 65  32)*2);.      me
4e70: 6d 73 65 74 28 70 4d 61 70 2c 20 30 2c 20 73 69  mset(pMap, 0, si
4e80: 7a 65 6f 66 28 42 74 72 65 65 50 74 72 6d 61 70  zeof(BtreePtrmap
4e90: 29 29 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e  ));.      pMap->
4ea0: 69 46 69 72 73 74 20 3d 20 70 42 74 2d 3e 6e 50  iFirst = pBt->nP
4eb0: 61 67 65 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  age + 1;.      p
4ec0: 42 74 2d 3e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  Bt->pMap = pMap;
4ed0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4ee0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64  urn rc;.}../* !d
4ef0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4f00: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
4f10: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 42 74  *.** Free any Bt
4f20: 72 65 65 50 74 72 6d 61 70 20 73 74 72 75 63 74  reePtrmap struct
4f30: 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ure allocated by
4f40: 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
4f50: 20 74 6f 0a 2a 2a 20 62 74 72 65 65 50 74 72 6d   to.** btreePtrm
4f60: 61 70 41 6c 6c 6f 63 61 74 65 28 29 2e 0a 2a 2f  apAllocate()..*/
4f70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
4f80: 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65 28 42  eePtrmapDelete(B
4f90: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
4fa0: 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d   BtreePtrmap *pM
4fb0: 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a  ap = pBt->pMap;.
4fc0: 20 20 69 66 28 20 70 4d 61 70 20 29 7b 0a 20 20    if( pMap ){.  
4fd0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4fe0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 29 3b  Map->aRollback);
4ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5000: 65 28 70 4d 61 70 2d 3e 61 50 74 72 29 3b 0a 20  e(pMap->aPtr);. 
5010: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5020: 70 4d 61 70 2d 3e 61 53 76 70 74 29 3b 0a 20 20  pMap->aSvpt);.  
5030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5040: 4d 61 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Map);.    pBt->p
5050: 4d 61 70 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  Map = 0;.  }.}.#
5060: 65 6c 73 65 20 20 2f 2a 20 53 51 4c 49 54 45 5f  else  /* SQLITE_
5070: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20  OMIT_CONCURRENT 
5080: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65  */.# define btre
5090: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
50a0: 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  x) SQLITE_OK.# d
50b0: 65 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61  efine btreePtrma
50c0: 70 44 65 6c 65 74 65 28 78 29 20 0a 23 20 64 65  pDelete(x) .# de
50d0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
50e0: 42 65 67 69 6e 28 78 2c 79 29 20 20 53 51 4c 49  Begin(x,y)  SQLI
50f0: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62  TE_OK.# define b
5100: 74 72 65 65 50 74 72 6d 61 70 45 6e 64 28 78 2c  treePtrmapEnd(x,
5110: 79 2c 7a 29 20 0a 23 65 6e 64 69 66 20 2f 2a 20  y,z) .#endif /* 
5120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
5130: 55 52 52 45 4e 54 20 2a 2f 0a 0a 73 74 61 74 69  URRENT */..stati
5140: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
5150: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
5160: 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20  e);  /* Forward 
5170: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
5180: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
5190: 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65 20  PageOne(MemPage 
51a0: 2a 70 50 61 67 65 29 3b 20 20 20 20 20 20 2f 2a  *pPage);      /*
51b0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
51c0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
51d0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  d releasePageNot
51e0: 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Null(MemPage *pP
51f0: 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  age);  /* Forwar
5200: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a  d reference */..
5210: 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f  /*.***** This ro
5220: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e  utine is used in
5230: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
5240: 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a   only ****.**.**
5250: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
5260: 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68   cursor holds th
5270: 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42  e mutex on its B
5280: 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65  tShared.*/.#ifde
5290: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
52a0: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
52b0: 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72  HoldsMutex(BtCur
52c0: 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  sor *p){.  retur
52d0: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
52e0: 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
52f0: 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66  ex);.}../* Verif
5300: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
5310: 72 20 61 6e 64 20 74 68 65 20 42 74 53 68 61 72  r and the BtShar
5320: 65 64 20 61 67 72 65 65 20 61 62 6f 75 74 20 77  ed agree about w
5330: 68 61 74 20 69 73 20 74 68 65 20 63 75 72 72 65  hat is the curre
5340: 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  nt.** database c
5350: 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20 69  onnetion. This i
5360: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 73  s important in s
5370: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
5380: 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  . If the databas
5390: 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  e .** connection
53a0: 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f 75   pointers get ou
53b0: 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69 73  t-of-sync, it is
53c0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 6f   possible for ro
53d0: 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20 62  utines like.** b
53e0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74  treeInitPage() t
53f0: 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20 73  o reference an s
5400: 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tale connection 
5410: 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65 66  pointer that ref
5420: 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20 63  erences a.** a c
5430: 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 68  onnection that h
5440: 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73 65  as already close
5450: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
5460: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
5470: 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74  assert().** stat
5480: 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64 20  ements only and 
5490: 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
54a0: 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 69  of double-checki
54b0: 6e 67 20 74 68 61 74 20 74 68 65 20 62 74 72 65  ng that the btre
54c0: 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20 6b  e code.** does k
54d0: 65 65 70 20 74 68 65 20 64 61 74 61 62 61 73 65  eep the database
54e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e   connection poin
54f0: 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e  ters up-to-date.
5500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5510: 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
5520: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  d(BtCursor *p){.
5530: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
5540: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
5550: 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42  .  return (p->pB
5560: 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74  tree->db==p->pBt
5570: 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->db);.}.#endif.
5580: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
5590: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
55a0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
55b0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
55c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
55d0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
55e0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
55f0: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
5600: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
5610: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
5620: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
5630: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
5640: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
5650: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
5660: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
5670: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
5680: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
5690: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
56a0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
56b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
56c0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
56d0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
56e0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
56f0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5700: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5710: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5720: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
5730: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
5740: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5750: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
5760: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
5770: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5780: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
5790: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
57a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
57b0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
57c0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
57d0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
57e0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
57f0: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
5800: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
5810: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
5820: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
5830: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
5840: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
5850: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
5860: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
5870: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
5880: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
5890: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
58a0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
58b0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
58c0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
58d0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
58e0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
58f0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5900: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
5910: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
5920: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
5930: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
5940: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
5950: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
5960: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
5970: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
5980: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
5990: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
59a0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
59b0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
59c0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
59d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
59e0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
59f0: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
5a00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
5a10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
5a20: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
5a30: 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  eck */.  Pgno pg
5a40: 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  noRoot,         
5a50: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
5a60: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
5a70: 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69 52  ging */.  i64 iR
5a80: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
5a90: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
5aa0: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
5ab0: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
5ac0: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
5ad0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
5ae0: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
5af0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
5b00: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5b10: 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49  if( pBtree->hasI
5b20: 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20  ncrblobCur==0 ) 
5b30: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
5b40: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
5b50: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
5b60: 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61   );.  pBtree->ha
5b70: 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30  sIncrblobCur = 0
5b80: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
5b90: 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
5ba0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
5bb0: 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46      if( (p->curF
5bc0: 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72  lags & BTCF_Incr
5bd0: 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  blob)!=0 ){.    
5be0: 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63    pBtree->hasInc
5bf0: 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20  rblobCur = 1;.  
5c00: 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
5c10: 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20 26 26  oot==pgnoRoot &&
5c20: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
5c30: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
5c40: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 20  iRow) ){.       
5c50: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
5c60: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
5c70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
5c80: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
5c90: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
5ca0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
5cb0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
5cc0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
5cd0: 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c 79  lobCursors(w,x,y
5ce0: 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,z).#endif /* SQ
5cf0: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
5d00: 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OB */../*.** Set
5d10: 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65   bit pgno of the
5d20: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
5d30: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68  ntent bitvec. Th
5d40: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a  is is called .**
5d50: 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61   when a page tha
5d60: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e  t previously con
5d70: 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f  tained data beco
5d80: 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20  mes a free-list 
5d90: 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a  leaf .** page..*
5da0: 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65  *.** The BtShare
5db0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
5dc0: 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77  tvec exists to w
5dd0: 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62  ork around an ob
5de0: 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75  scure.** bug cau
5df0: 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72  sed by the inter
5e00: 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73  action of two us
5e10: 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61  eful IO optimiza
5e20: 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e  tions surroundin
5e30: 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c  g.** free-list l
5e40: 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a  eaf pages:.**.**
5e50: 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64     1) When all d
5e60: 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66  ata is deleted f
5e70: 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74  rom a page and t
5e80: 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a  he page becomes.
5e90: 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c  **      a free-l
5ea0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
5eb0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77  he page is not w
5ec0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
5ed0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28  tabase.**      (
5ee0: 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  as free-list lea
5ef0: 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20  f pages contain 
5f00: 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61  no meaningful da
5f10: 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a  ta). Sometimes.*
5f20: 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61  *      such a pa
5f30: 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a  ge is not even j
5f40: 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74  ournalled (as it
5f50: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64   will not be mod
5f60: 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77  ified,.**      w
5f70: 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61  hy bother journa
5f80: 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a  lling it?)..**.*
5f90: 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72  *   2) When a fr
5fa0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
5fb0: 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73  e is reused, its
5fc0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
5fd0: 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
5fe0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  m the database o
5ff0: 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  r written to the
6000: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77   journal file (w
6010: 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20  hy should it.** 
6020: 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69       be, if it i
6030: 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61  s not at all mea
6040: 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a  ningful?)..**.**
6050: 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20   By themselves, 
6060: 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  these optimizati
6070: 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e  ons work fine an
6080: 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64  d provide a hand
6090: 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65  y.** performance
60a0: 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64   boost to bulk d
60b0: 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20  elete or insert 
60c0: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65  operations. Howe
60d0: 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67  ver, if.** a pag
60e0: 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  e is moved to th
60f0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
6100: 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68  then reused with
6110: 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  in the same.** t
6120: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72  ransaction, a pr
6130: 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20  oblem comes up. 
6140: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
6150: 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68  ot journalled wh
6160: 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65  en.** it is move
6170: 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
6180: 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73  st and it is als
6190: 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64  o not journalled
61a0: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65   when it.** is e
61b0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
61c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
61d0: 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65  reused, then the
61e0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a   original data.*
61f0: 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49  * may be lost. I
6200: 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
6210: 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61   rollback, it ma
6220: 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  y not be possibl
6230: 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  e.** to restore 
6240: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
6250: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
6260: 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  figuration..**.*
6270: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
6280: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  s the BtShared.p
6290: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
62a0: 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61  c. Whenever a pa
62b0: 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20  ge is .** moved 
62c0: 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65  to become a free
62d0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
62e0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
62f0: 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74  ng bit is.** set
6300: 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20   in the bitvec. 
6310: 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20  Whenever a leaf 
6320: 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65  page is extracte
6330: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
6340: 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a  list,.** optimiz
6350: 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73  ation 2 above is
6360: 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20   omitted if the 
6370: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
6380: 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  t is already.** 
6390: 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e  set in BtShared.
63a0: 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65  pHasContent. The
63b0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
63c0: 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61   bitvec are clea
63d0: 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  red.** at the en
63e0: 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73  d of every trans
63f0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
6400: 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61  c int btreeSetHa
6410: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
6420: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
6430: 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  o){.  int rc = S
6440: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
6450: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
6460: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
6470: 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67   pgno<=pBt->nPag
6480: 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48  e );.    pBt->pH
6490: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69  asContent = sqli
64a0: 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
64b0: 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
64c0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
64d0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
64e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
64f0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
6500: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
6510: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
6520: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
6530: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
6540: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
6550: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
6560: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
6570: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
6580: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6590: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
65a0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
65b0: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
65c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
65d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
65e0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
65f0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
6600: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
6610: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
6620: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
6630: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
6640: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
6650: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
6660: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
6670: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
6680: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
6690: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
66a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
66b0: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
66c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
66d0: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
66e0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
66f0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
6700: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
6710: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
6720: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
6730: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
6740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
6750: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
6760: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6770: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
6780: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
6790: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
67a0: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
67b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
67c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
67d0: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
67e0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
67f0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
6800: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
6810: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
6820: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
6830: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
6840: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66  * Release all of
6850: 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61   the apPage[] pa
6860: 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72  ges for a cursor
6870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6880: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
6890: 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75  CursorPages(BtCu
68a0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
68b0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 43 75 72  nt i;.  if( pCur
68c0: 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
68d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75    for(i=0; i<pCu
68e0: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
68f0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
6900: 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
6910: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
6920: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
6930: 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70 50  NotNull(pCur->pP
6940: 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  age);.    pCur->
6950: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 7d 0a  iPage = -1;.  }.
6960: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
6970: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
6980: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
6990: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
69a0: 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77  valid entry.** w
69b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
69c0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e 65  n is called (i.e
69d0: 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d 43  . have eState==C
69e0: 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68  URSOR_VALID). Th
69f0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
6a00: 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  aves the current
6a10: 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20 76   cursor key in v
6a20: 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e  ariables pCur->n
6a30: 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d  Key and.** pCur-
6a40: 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b  >pKey. SQLITE_OK
6a50: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6a60: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e  successful or an
6a70: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a   SQLite error .*
6a80: 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  * code otherwise
6a90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
6aa0: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
6ab0: 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
6ac0: 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67  , then the integ
6ad0: 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72  er key.** (the r
6ae0: 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64 20  owid) is stored 
6af0: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e  in pCur->nKey an
6b00: 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20  d pCur->pKey is 
6b10: 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e  left set to.** N
6b20: 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72 73  ULL. If the curs
6b30: 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20  or is open on a 
6b40: 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65  non-intkey table
6b50: 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65  , then pCur->pKe
6b60: 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20  y is .** set to 
6b70: 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f  point to a mallo
6b80: 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72 2d  ced buffer pCur-
6b90: 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20 73  >nKey bytes in s
6ba0: 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a  ize containing .
6bb0: 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73  ** the key..*/.s
6bc0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
6bd0: 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f 72  rsorKey(BtCursor
6be0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6c00: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
6c10: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6c20: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
6c30: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
6c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6c50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
6c60: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
6c70: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a  r->curIntKey ){.
6c80: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20      /* Only the 
6c90: 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72 65  rowid is require
6ca0: 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74  d for a table bt
6cb0: 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  ree */.    pCur-
6cc0: 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42  >nKey = sqlite3B
6cd0: 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70  treeIntegerKey(p
6ce0: 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
6cf0: 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64     /* For an ind
6d00: 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20 74  ex btree, save t
6d10: 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79 20  he complete key 
6d20: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 76  content */.    v
6d30: 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 70  oid *pKey;.    p
6d40: 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69  Cur->nKey = sqli
6d50: 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
6d60: 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ize(pCur);.    p
6d70: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
6d80: 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20  loc( pCur->nKey 
6d90: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
6da0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
6db0: 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
6dc0: 64 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  d(pCur, 0, (int)
6dd0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
6de0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
6df0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6e00: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
6e10: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
6e20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6e30: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
6e40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6e50: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
6e60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
6e70: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  T;.    }.  }.  a
6e80: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75  ssert( !pCur->cu
6e90: 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  rIntKey || !pCur
6ea0: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75  ->pKey );.  retu
6eb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6ec0: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
6ed0: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
6ee0: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
6ef0: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
6f00: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
6f10: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
6f20: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
6f30: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
6f40: 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  RESEEK..**.** Th
6f50: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
6f60: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
6f70: 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68  rsor is valid (h
6f80: 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  as eState==CURSO
6f90: 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f  R_VALID).** prio
6fa0: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
6fb0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a  s routine.  .*/.
6fc0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
6fd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6fe0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6ff0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
7000: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
7010: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c  ==pCur->eState |
7020: 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  | CURSOR_SKIPNEX
7030: 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  T==pCur->eState 
7040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
7050: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
7060: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
7070: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
7080: 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ;..  if( pCur->e
7090: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
70a0: 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43  IPNEXT ){.    pC
70b0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
70c0: 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c  SOR_VALID;.  }el
70d0: 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b  se{.    pCur->sk
70e0: 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ipNext = 0;.  }.
70f0: 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  .  rc = saveCurs
7100: 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69  orKey(pCur);.  i
7110: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7120: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
7130: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
7140: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
7150: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
7160: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
7170: 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75  .  }..  pCur->cu
7180: 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
7190: 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
71a0: 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41  ValidOvfl|BTCF_A
71b0: 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  tLast);.  return
71c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
71d0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
71e0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
71f0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
7200: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43  ursorsOnList(BtC
7210: 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75  ursor*,Pgno,BtCu
7220: 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  rsor*);../*.** S
7230: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
7240: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
7250: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
7260: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
7270: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
7280: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
7290: 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74  Root.  "Saving t
72a0: 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  he cursor positi
72b0: 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a  on" means that.*
72c0: 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69  * the location i
72d0: 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72  n the btree is r
72e0: 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63  emembered in suc
72f0: 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20  h a way that it 
7300: 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20  can be.** moved 
7310: 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65  back to the same
7320: 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20   spot after the 
7330: 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d  btree has been m
7340: 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a  odified.  This.*
7350: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
7360: 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20  led just before 
7370: 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69  cursor pExcept i
7380: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
7390: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66   the.** table, f
73a0: 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74  or example in Bt
73b0: 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
73c0: 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a  treeInsert()..**
73d0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
73e0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
73f0: 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
7400: 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
7410: 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72   such .** cursor
7420: 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68  s should have th
7430: 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  eir BTCF_Multipl
7440: 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65  e flag set.  The
7450: 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a   btreeCursor().*
7460: 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63  * routine enforc
7470: 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54  es that rule.  T
7480: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
7490: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c   needs to be cal
74a0: 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  led in.** the un
74b0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e  common case when
74c0: 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65   pExpect has the
74d0: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
74e0: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  lag set..**.** I
74f0: 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20  f pExpect!=NULL 
7500: 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  and if no other 
7510: 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e  cursors are foun
7520: 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f  d on the same ro
7530: 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e  ot-page,.** then
7540: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
7550: 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65  le flag on pExpe
7560: 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74  ct is cleared, t
7570: 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a  o avoid another.
7580: 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c  ** pointless cal
7590: 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
75a0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  e..**.** Impleme
75b0: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
75c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
75d0: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
75e0: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
75f0: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
7600: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
7610: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
7620: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
7630: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
7640: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
7650: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
7660: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
7670: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
7680: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
7690: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
76a0: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
76b0: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
76c0: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
76d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
76e0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
76f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
7700: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
7710: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
7720: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
7730: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
7740: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7750: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
7760: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
7770: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
7780: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
7790: 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65   p ) return save
77a0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c  CursorsOnList(p,
77b0: 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29   iRoot, pExcept)
77c0: 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20  ;.  if( pExcept 
77d0: 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c  ) pExcept->curFl
77e0: 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c  ags &= ~BTCF_Mul
77f0: 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  tiple;.  return 
7800: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7810: 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75   This helper rou
7820: 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43  tine to saveAllC
7830: 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20  ursors does the 
7840: 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73  actual work of s
7850: 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72  aving.** the cur
7860: 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e  sors if and when
7870: 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75   a cursor is fou
7880: 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79  nd that actually
7890: 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67   requires saving
78a0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20  ..** The common 
78b0: 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20  case is that no 
78c0: 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20  cursors need to 
78d0: 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69  be saved, so thi
78e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
78f0: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20  broken out from 
7900: 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76  its caller to av
7910: 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
7920: 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f  stack pointer mo
7930: 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  vement..*/.stati
7940: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
7950: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
7960: 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72  sOnList(.  BtCur
7970: 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  sor *p,         
7980: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72  /* The first cur
7990: 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73  sor that needs s
79a0: 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  aving */.  Pgno 
79b0: 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iRoot,          
79c0: 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72  /* Only save cur
79d0: 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52  sor with this iR
79e0: 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66  oot. Save all if
79f0: 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72   zero */.  BtCur
7a00: 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20  sor *pExcept    
7a10: 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74  /* Do not save t
7a20: 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  his cursor */.){
7a30: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
7a40: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
7a50: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
7a60: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b  oRoot==iRoot) ){
7a70: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53  .      if( p->eS
7a80: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
7a90: 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d  ID || p->eState=
7aa0: 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
7ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
7ac0: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
7ad0: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
7ae0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7af0: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20  K!=rc ){.       
7b00: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7b20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
7b30: 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e  tcase( p->iPage>
7b40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  =0 );.        bt
7b50: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
7b60: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
7b70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
7b80: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
7b90: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
7ba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
7bc0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
7bd0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
7be0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
7bf0: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
7c00: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
7c10: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
7c20: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
7c30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
7c40: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
7c50: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
7c60: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
7c70: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
7c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
7c90: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
7ca0: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
7cb0: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
7cc0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
7cd0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
7ce0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
7cf0: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
7d00: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
7d10: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
7d20: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
7d30: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
7d40: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
7d50: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
7d60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
7d70: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
7d80: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
7d90: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
7da0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
7db0: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
7dc0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
7dd0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
7de0: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7e00: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
7e10: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
7e20: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
7e30: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
7e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
7e50: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
7e60: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
7e70: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
7e80: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
7e90: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
7ea0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
7ed0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
7ee0: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
7ef0: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
7f00: 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20  x key */..  if( 
7f10: 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
7f20: 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28  rt( nKey==(i64)(
7f30: 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20  int)nKey );.    
7f40: 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
7f50: 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
7f60: 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70  edRecord(pCur->p
7f70: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  KeyInfo);.    if
7f80: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
7f90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
7fa0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c  EM_BKPT;.    sql
7fb0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
7fc0: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
7fd0: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
7fe0: 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  pKey, pIdxKey);.
7ff0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
8000: 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20  >nField==0 ){.  
8010: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8020: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8030: 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
8040: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  done;.    }.  }e
8050: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
8060: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
8070: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
8080: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
8090: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
80a0: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f   bias, pRes);.mo
80b0: 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28  veto_done:.  if(
80c0: 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
80d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
80e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
80f0: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  , pIdxKey);.  }.
8100: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8110: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
8120: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
8130: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
8140: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
8150: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
8160: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
8170: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
8180: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
8190: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
81a0: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
81b0: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
81c0: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
81d0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
81e0: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
81f0: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
8200: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
8210: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8220: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
8230: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
8240: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73  Position()..*/.s
8250: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52  tatic int btreeR
8260: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
8270: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
8280: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
8290: 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a    int skipNext;.
82a0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
82b0: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
82c0: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
82d0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
82e0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
82f0: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
8300: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
8310: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
8320: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
8330: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
8340: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
8350: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
8360: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
8370: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
8380: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69  r->nKey, 0, &ski
8390: 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63  pNext);.  if( rc
83a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
83b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
83c0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
83d0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
83e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
83f0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
8400: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
8410: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
8420: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70  INVALID );.    p
8430: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d  Cur->skipNext |=
8440: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
8450: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
8460: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
8470: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
8480: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
8490: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
84a0: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
84b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
84c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
84d0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
84e0: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
84f0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
8500: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
8510: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
8520: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
8530: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
8540: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
8550: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
8560: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
8570: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
8580: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
8590: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
85a0: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
85b0: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
85c0: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
85d0: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
85e0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
85f0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
8600: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
8610: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
8620: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
8630: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
8640: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
8650: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
8660: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
8670: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
8680: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8690: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
86a0: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
86b0: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
86c0: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
86d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
86e0: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
86f0: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
8700: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
8710: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
8720: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
8730: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
8740: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
8750: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
8760: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
8770: 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
8780: 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  rn pCur->eState!
8790: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
87a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
87b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61   pointer to a fa
87c0: 6b 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  ke BtCursor obje
87d0: 63 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77  ct that will alw
87e0: 61 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61  ays answer.** fa
87f0: 6c 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74  lse to the sqlit
8800: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
8810: 4d 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20  Moved() routine 
8820: 61 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65  above.  The fake
8830: 0a 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72  .** cursor retur
8840: 6e 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ned must not be 
8850: 75 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  used with any ot
8860: 68 65 72 20 42 74 72 65 65 20 69 6e 74 65 72 66  her Btree interf
8870: 61 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72  ace..*/.BtCursor
8880: 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 61   *sqlite3BtreeFa
8890: 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f  keValidCursor(vo
88a0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38  id){.  static u8
88b0: 20 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55   fakeCursor = CU
88c0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73  RSOR_VALID;.  as
88d0: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42  sert( offsetof(B
88e0: 74 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29  tCursor, eState)
88f0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
8900: 28 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65  (BtCursor*)&fake
8910: 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cursor;.}../*.**
8920: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
8930: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
8940: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
8950: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
8960: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
8970: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
8980: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
8990: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
89a0: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
89b0: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
89c0: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
89d0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
89e0: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
89f0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
8a00: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
8a10: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
8a20: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
8a30: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
8a40: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
8a50: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
8a60: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
8a70: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
8a80: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
8a90: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
8aa0: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
8ab0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
8ac0: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
8ad0: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
8ae0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
8af0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
8b00: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
8b10: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
8b20: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
8b30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
8b40: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
8b50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
8b60: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
8b70: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
8b80: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
8b90: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
8ba0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
8bb0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
8bc0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
8bd0: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
8be0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
8bf0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
8c00: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
8c10: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
8c20: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
8c30: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
8c40: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
8c50: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
8c60: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
8c70: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
8c80: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
8c90: 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  kipNext==0 );.  
8ca0: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
8cb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
8cc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8cd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8ce0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
8cf0: 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  TS./*.** Provide
8d00: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
8d10: 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69  rsor.  The parti
8d20: 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e  cular hint given
8d30: 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a   (and the type.*
8d40: 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  * and number of 
8d50: 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72 61  the varargs para
8d60: 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65 72  meters) is deter
8d70: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48 69  mined by the eHi
8d80: 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65  ntType.** parame
8d90: 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64 65  ter.  See the de
8da0: 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  finitions of the
8db0: 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61   BTREE_HINT_* ma
8dc0: 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73  cros for details
8dd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8de0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
8df0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
8e00: 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20   int eHintType, 
8e10: 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20  ...){.  /* Used 
8e20: 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74  only by system t
8e30: 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20 74  hat substitute t
8e40: 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65  heir own storage
8e50: 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e   engine */.}.#en
8e60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  dif../*.** Provi
8e70: 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f  de flag hints to
8e80: 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
8e90: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
8ea0: 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73  eCursorHintFlags
8eb0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
8ec0: 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20   unsigned x){.  
8ed0: 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45  assert( x==BTREE
8ee0: 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42  _SEEK_EQ || x==B
8ef0: 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c  TREE_BULKLOAD ||
8f00: 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d   x==0 );.  pCur-
8f10: 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a  >hints = x;.}...
8f20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8f30: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
8f40: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
8f50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
8f60: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
8f70: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
8f80: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
8f90: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
8fa0: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
8fb0: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
8fc0: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
8fd0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
8fe0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f  .** Return 0 (no
8ff0: 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20  t a valid page) 
9000: 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63  for pgno==1 sinc
9010: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  e there is.** no
9020: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73   pointer map ass
9030: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
9040: 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72  e 1.  The integr
9050: 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a  ity_check logic.
9060: 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ** requires that
9070: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c   ptrmapPageno(*,
9080: 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  1)!=1..*/.static
9090: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
90a0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
90b0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
90c0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
90d0: 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Page;.  Pgno iPt
90e0: 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73  rMap, ret;.  ass
90f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9100: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
9110: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
9120: 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  o<2 ) return 0;.
9130: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
9140: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
9150: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
9160: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
9170: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
9180: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
9190: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
91a0: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
91b0: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
91c0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
91d0: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
91e0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
91f0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
9200: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
9210: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
9220: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
9230: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
9240: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
9250: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
9260: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
9270: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
9280: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
9290: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
92a0: 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  no'..**.** If *p
92b0: 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  RC is initially 
92c0: 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51  non-zero (non-SQ
92d0: 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68  LITE_OK) then th
92e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
92f0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e   a no-op.  If an
9300: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
9310: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
9320: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69  rror code is wri
9330: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52  tten.** into *pR
9340: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  C..*/.static voi
9350: 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  d ptrmapPut(BtSh
9360: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
9370: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
9380: 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20  gno parent, int 
9390: 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20  *pRC){.  DbPage 
93a0: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
93b0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
93c0: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
93d0: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
93e0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
93f0: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
9400: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
9410: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
9420: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
9430: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
9440: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
9450: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
9460: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
9470: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
9480: 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
9490: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
94a0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
94b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
94c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
94d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
94e0: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
94f0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
9500: 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f  s never added to
9510: 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
9520: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
9530: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
9540: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
9550: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
9560: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
9570: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
9580: 54 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 4d 61  T.  if( pBt->pMa
9590: 70 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  p ){.    *pRC = 
95a0: 62 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65  btreePtrmapStore
95b0: 28 70 42 74 2c 20 6b 65 79 2c 20 65 54 79 70 65  (pBt, key, eType
95c0: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 72  , parent);.    r
95d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
95e0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  f..  assert( pBt
95f0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
9600: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
9610: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
9620: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9630: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9640: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
9650: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
9660: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
9670: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
9680: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
9690: 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a  , &pDbPage, 0);.
96a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
96b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
96c0: 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
96d0: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
96e0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
96f0: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
9700: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
9710: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
9720: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9730: 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d  T;.    goto ptrm
9740: 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61  ap_exit;.  }.  a
9750: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
9760: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
9770: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74  eSize-5 );.  pPt
9780: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
9790: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
97a0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
97b0: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
97c0: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
97d0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
97e0: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
97f0: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
9800: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
9810: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
9820: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
9830: 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72  t));.    *pRC= r
9840: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
9850: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
9860: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9870: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
9880: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
9890: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
98a0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
98b0: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
98c0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70  t);.    }.  }..p
98d0: 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71  trmap_exit:.  sq
98e0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
98f0: 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pDbPage);.}../*.
9900: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
9910: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
9920: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
9930: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
9940: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
9950: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
9960: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
9970: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
9980: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
9990: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
99a0: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
99b0: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
99c0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
99d0: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
99e0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
99f0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
9a00: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
9a10: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
9a20: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
9a30: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
9a40: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
9a50: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
9a60: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
9a70: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
9a80: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
9a90: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
9aa0: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
9ab0: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
9ac0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9ad0: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
9ae0: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
9af0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9b00: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
9b10: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
9b20: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
9b30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9b40: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
9b50: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
9b60: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
9b70: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
9b80: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
9b90: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
9ba0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20  rmap, &pDbPage, 
9bb0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  0);.  if( rc!=0 
9bc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
9bd0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
9be0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
9bf0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
9c00: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
9c10: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
9c20: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
9c30: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
9c40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
9c50: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
9c60: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
9c70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9c80: 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
9c90: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
9ca0: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
9cb0: 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -5 );.  assert( 
9cc0: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
9cd0: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
9ce0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
9cf0: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
9d00: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
9d10: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
9d20: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
9d30: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
9d40: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
9d50: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
9d60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9d70: 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29  PT_PGNO(iPtrmap)
9d80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9d90: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  E_OK;.}..#else /
9da0: 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c  * if defined SQL
9db0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
9dc0: 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  UUM */.  #define
9dd0: 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79   ptrmapPut(w,x,y
9de0: 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65  ,z,rc).  #define
9df0: 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79   ptrmapGet(w,x,y
9e00: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
9e10: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
9e20: 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72  tOvflPtr(x, y, r
9e30: 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
9e40: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
9e50: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
9e60: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
9e70: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
9e80: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
9e90: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
9ea0: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
9eb0: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
9ec0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
9ed0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
9ee0: 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ** findCellPastP
9ef0: 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73 61  tr() does the sa
9f00: 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b 69  me except it ski
9f10: 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69 74  ps past the init
9f20: 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68  ial.** 4-byte ch
9f30: 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e  ild pointer foun
9f40: 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  d on interior pa
9f50: 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69 73  ges, if there is
9f60: 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   one..**.** This
9f70: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
9f80: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
9f90: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
9fa0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
9fb0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
9fc0: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
9fd0: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
9fe0: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
9ff0: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
a000: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
a010: 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66  I)]))).#define f
a020: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50  indCellPastPtr(P
a030: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
a040: 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e  ataOfst + ((P)->
a050: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
a060: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
a070: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
a080: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
a090: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20   is common tail 
a0a0: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62  processing for b
a0b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
a0c0: 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50  () and.** btreeP
a0d0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
a0e0: 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  () for the case 
a0f0: 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f  when the cell do
a100: 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72  es not fit entir
a110: 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67  ely.** on a sing
a120: 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20  le B-tree page. 
a130: 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20   Make necessary 
a140: 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74  adjustments to t
a150: 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73  he CellInfo.** s
a160: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
a170: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
a180: 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50 61  INE void btreePa
a190: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
a1a0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20  eForOverflow(.  
a1b0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a1c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a1d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a1e0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a1f0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a200: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a210: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a220: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a230: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a240: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a250: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ture */.){.  /* 
a260: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
a270: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
a280: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
a290: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
a2a0: 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65  e.  ** to decide
a2b0: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
a2c0: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
a2d0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
a2e0: 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66   onto.  ** overf
a2f0: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
a300: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
a310: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
a320: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a  nt of unused.  *
a330: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
a340: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
a350: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
a360: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
a370: 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77  age.  ** in betw
a380: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
a390: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a   maxLocal..  **.
a3a0: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
a3b0: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
a3c0: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
a3d0: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
a3e0: 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20  in any.  ** way 
a3f0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
a400: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
a410: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f  ile format..  */
a420: 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b  .  int minLocal;
a430: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
a440: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
a450: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
a460: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
a470: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
a480: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
a490: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
a4a0: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
a4b0: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
a4c0: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
a4d0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
a4e0: 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ..  minLocal = p
a4f0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a500: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
a510: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
a520: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
a530: 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  al + (pInfo->nPa
a540: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
a550: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
a560: 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20  sableSize-4);.  
a570: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
a580: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
a590: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
a5a0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
a5b0: 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73 20  ;.  if( surplus 
a5c0: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
a5d0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
a5e0: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
a5f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
a600: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
a610: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  16)minLocal;.  }
a620: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
a630: 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e  = (u16)(&pInfo->
a640: 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e  pPayload[pInfo->
a650: 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29  nLocal] - pCell)
a660: 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 4;.}../*.** T
a670: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
a680: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
a690: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
a6a0: 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43   MemPage.xParseC
a6b0: 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e  ell().** method.
a6c0: 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  .**.** Parse a c
a6d0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
a6e0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
a6f0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
a700: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65  ture..**.** btre
a710: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
a720: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c         =>   tabl
a730: 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64  e btree leaf nod
a740: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
a750: 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20  CellNoPayload() 
a760: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
a770: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
a780: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
a790: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d  llPtrIndex()   =
a7a0: 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20  >   index btree 
a7b0: 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nodes.**.** Ther
a7c0: 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70  e is also a wrap
a7d0: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72  per function btr
a7e0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68  eeParseCell() th
a7f0: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
a800: 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65  all MemPage type
a810: 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72  s and that refer
a820: 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62  ences the cell b
a830: 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  y index rather t
a840: 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65  han.** by pointe
a850: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
a860: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
a870: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20  PtrNoPayload(.  
a880: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a890: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a8a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a8b0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a8c0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a8d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a8e0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a8f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a900: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a910: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a920: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
a930: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a940: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a950: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a960: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
a970: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eaf==0 );.  asse
a980: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
a990: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69  PtrSize==4 );.#i
a9a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
a9b0: 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  UG.  UNUSED_PARA
a9c0: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a9d0: 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  ndif.  pInfo->nS
a9e0: 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72  ize = 4 + getVar
a9f0: 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28  int(&pCell[4], (
aa00: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
aa10: 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  y);.  pInfo->nPa
aa20: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e  yload = 0;.  pIn
aa30: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a  fo->nLocal = 0;.
aa40: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
aa50: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
aa60: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
aa70: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
aa80: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
aa90: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
aaa0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
aab0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
aac0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
aad0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
aae0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
aaf0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
ab00: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
ab10: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
ab20: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
ab30: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
ab40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
ab50: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
ab60: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
ab70: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
ab80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ab90: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
aba0: 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20  ayload */.  u64 
abb0: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
abc0: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64      /* Extracted
abd0: 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20   Key value */.. 
abe0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
abf0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ac00: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
ac10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ac20: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
ac30: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
ac40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ac50: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20  >intKeyLeaf );. 
ac60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ac70: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
ac80: 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65  );.  pIter = pCe
ac90: 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ll;..  /* The ne
aca0: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
acb0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
acc0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
acd0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
ace0: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61  int32(pIter, nPa
acf0: 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a  yload);.  **.  *
ad00: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
ad10: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
ad20: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
ad30: 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20    */.  nPayload 
ad40: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
ad50: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
ad60: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
ad70: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
ad80: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
ad90: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
ada0: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
adb0: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
adc0: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
add0: 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65    }while( (*pIte
ade0: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
adf0: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
ae00: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54  pIter++;..  /* T
ae10: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
ae20: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
ae30: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
ae40: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
ae50: 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20  etVarint(pIter, 
ae60: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
ae70: 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ey);.  **.  ** T
ae80: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
ae90: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
aea0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
aeb0: 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65  /.  iKey = *pIte
aec0: 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30  r;.  if( iKey>=0
aed0: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
aee0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b  End = &pIter[7];
aef0: 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37  .    iKey &= 0x7
af00: 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b  f;.    while(1){
af10: 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69  .      iKey = (i
af20: 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  Key<<7) | (*++pI
af30: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
af40: 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c     if( (*pIter)<
af50: 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  0x80 ) break;.  
af60: 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70      if( pIter>=p
af70: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69  End ){.        i
af80: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20  Key = (iKey<<8) 
af90: 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20  | *++pIter;.    
afa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
afb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
afc0: 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f  Iter++;..  pInfo
afd0: 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29  ->nKey = *(i64*)
afe0: 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e  &iKey;.  pInfo->
aff0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
b000: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
b010: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
b020: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
b030: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
b040: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
b050: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
b060: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
b070: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
b080: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
b090: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
b0a0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
b0b0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
b0c0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
b0d0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
b0e0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
b0f0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
b100: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
b110: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
b120: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
b130: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
b140: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
b150: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
b160: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
b170: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
b180: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
b190: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
b1a0: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
b1b0: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
b1c0: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
b1d0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
b1e0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
b1f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
b200: 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61  trIndex(.  MemPa
b210: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
b220: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
b230: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
b240: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
b250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b260: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
b270: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
b280: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
b290: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
b2a0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
b2b0: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  */.){.  u8 *pIte
b2c0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
b2d0: 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20  /* For scanning 
b2e0: 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f  through pCell */
b2f0: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
b300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b310: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
b320: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
b330: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
b340: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b350: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b360: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b370: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
b380: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
b390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b3a0: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d  ge->intKeyLeaf==
b3b0: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
b3c0: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
b3d0: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50  ildPtrSize;.  nP
b3e0: 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b  ayload = *pIter;
b3f0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e  .  if( nPayload>
b400: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
b410: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38  *pEnd = &pIter[8
b420: 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  ];.    nPayload 
b430: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
b440: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
b450: 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20  = (nPayload<<7) 
b460: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
b470: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
b480: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
b490: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b4a0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
b4b0: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
b4c0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
b4d0: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
b4e0: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
b4f0: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
b500: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
b510: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
b520: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
b530: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
b540: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
b550: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
b560: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
b570: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
b580: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
b590: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
b5a0: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
b5b0: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
b5c0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
b5d0: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
b5e0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
b5f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
b600: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
b610: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
b620: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
b630: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
b640: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
b650: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
b660: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
b670: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c  )nPayload;.  }el
b680: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
b690: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
b6a0: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
b6b0: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
b6c0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
b6d0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
b6e0: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
b6f0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
b700: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
b710: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
b720: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
b730: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
b740: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
b750: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
b760: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
b770: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
b780: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
b790: 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d  e */.){.  pPage-
b7a0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b7b0: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
b7c0: 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f  e, iCell), pInfo
b7d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
b7e0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
b7f0: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
b800: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
b810: 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a  mPage.xCellSize.
b820: 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  ** method..**.**
b830: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
b840: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
b850: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
b860: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
b870: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
b880: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
b890: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
b8a0: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
b8b0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
b8c0: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
b8d0: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
b8e0: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
b8f0: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
b900: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
b910: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
b920: 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  **.** cellSizePt
b930: 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20  rNoPayload()    
b940: 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72  =>   table inter
b950: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c  nal nodes.** cel
b960: 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20  lSizePtr()      
b970: 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20         =>   all 
b980: 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61  index nodes & ta
b990: 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ble leaf nodes.*
b9a0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
b9b0: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
b9c0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
b9d0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
b9e0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
b9f0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20  ->childPtrSize; 
ba00: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
ba10: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
ba20: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
ba30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
ba60: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75   a varint */.  u
ba70: 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  32 nSize;       
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
baa0: 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
bab0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
bac0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
bad0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
bae0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
baf0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
bb00: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
bb10: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
bb20: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
bb30: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
bb40: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
bb50: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
bb60: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
bb70: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
bb80: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
bb90: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
bba0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
bbb0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
bbc0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
bbd0: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
bbe0: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
bbf0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
bc00: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
bc10: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
bc20: 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20  ndif..  nSize = 
bc30: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
bc40: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
bc50: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38   pEnd = &pIter[8
bc60: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
bc70: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
bc80: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
bc90: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
bca0: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
bcb0: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
bcc0: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
bcd0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
bce0: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
bcf0: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
bd00: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
bd10: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
bd20: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
bd30: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
bd40: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
bd50: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
bd60: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
bd70: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
bd80: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
bd90: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
bda0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bdb0: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
bdc0: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
bdd0: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
bde0: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
bdf0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
be00: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
be10: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
be20: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
be30: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
be40: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
be50: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
be60: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
be70: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
be80: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
be90: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
bea0: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
beb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
bec0: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
bed0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
bee0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
bef0: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
bf00: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
bf10: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
bf20: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
bf30: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
bf40: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
bf50: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
bf60: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
bf70: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
bf80: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
bf90: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
bfa0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
bfb0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
bfc0: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
bfd0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
bfe0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
bff0: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
c000: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
c010: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
c020: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74  (u16)nSize;.}.st
c030: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
c040: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65  ePtrNoPayload(Me
c050: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
c060: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
c070: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
c080: 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  4; /* For loopin
c090: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
c0a0: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
c0b0: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
c0c0: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
c0d0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23  r a varint */..#
c0e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c0f0: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
c100: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
c110: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
c120: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
c130: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
c140: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
c150: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
c160: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
c170: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
c180: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
c190: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
c1a0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
c1b0: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
c1c0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
c1d0: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
c1e0: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
c1f0: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
c200: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
c210: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
c220: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
c230: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
c240: 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  uginfo);.#else. 
c250: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
c260: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
c270: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
c280: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
c290: 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70  =4 );.  pEnd = p
c2a0: 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c  Iter + 9;.  whil
c2b0: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
c2c0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
c2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
c2e0: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28  buginfo.nSize==(
c2f0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
c300: 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
c310: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
c320: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
c330: 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  l);.}...#ifdef S
c340: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
c350: 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e  his variation on
c360: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69   cellSizePtr() i
c370: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
c380: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
c390: 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f  ents.** only. */
c3a0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
c3b0: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
c3c0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
c3d0: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d  .  return pPage-
c3e0: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
c3f0: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
c400: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
c410: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
c420: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
c430: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
c440: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
c450: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
c460: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
c470: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
c480: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
c490: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
c4a0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
c4b0: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
c4c0: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
c4d0: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
c4e0: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
c4f0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
c500: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
c510: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
c520: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
c530: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
c540: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
c550: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
c560: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
c570: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
c580: 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
c590: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e  yload ){.    Pgn
c5a0: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
c5b0: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53  e(&pCell[info.nS
c5c0: 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72  ize-4]);.    ptr
c5d0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
c5e0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
c5f0: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
c600: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
c610: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
c620: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
c630: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68  e page given. Th
c640: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67  is routine reorg
c650: 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74  anizes cells wit
c660: 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hin the.** page 
c670: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
c680: 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73  e no free-blocks
c690: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f   on the free-blo
c6a0: 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50  ck list..**.** P
c6b0: 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61  arameter nMaxFra
c6c0: 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  g is the maximum
c6d0: 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d   amount of fragm
c6e0: 65 6e 74 65 64 20 73 70 61 63 65 20 74 68 61 74  ented space that
c6f0: 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65   may be.** prese
c700: 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 61  nt in the page a
c710: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
c720: 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  e returns..**.**
c730: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c740: 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69  44582-60138 SQLi
c750: 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65  te may from time
c760: 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e   to time reorgan
c770: 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20  ize a.** b-tree 
c780: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
c790: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c  re are no freebl
c7a0: 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74  ocks or fragment
c7b0: 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75   bytes, all.** u
c7c0: 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20  nused bytes are 
c7d0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
c7e0: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61   unallocated spa
c7f0: 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61  ce region, and a
c800: 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20  ll.** cells are 
c810: 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61  packed tightly a
c820: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c830: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
c840: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
c850: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c860: 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67  ge, int nMaxFrag
c870: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
c8a0: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
c8d0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  e i-th cell */. 
c8e0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c900: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
c910: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
c920: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
c930: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c940: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
c950: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
c960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c970: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
c980: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
c990: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
c9a0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
c9b0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
c9c0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
c9d0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
c9e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9f0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
ca00: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ca10: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
ca20: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
ca30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ca40: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
ca50: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
ca60: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
ca70: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
ca80: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
ca90: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
caa0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
cab0: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
cac0: 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ent */.  unsigne
cad0: 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20  d char *src;    
cae0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66      /* Source of
caf0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
cb00: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
cb10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
cb20: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
cb30: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
cb40: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
cb50: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
cb60: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
cb70: 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ex */..  assert(
cb80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
cb90: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
cba0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
cbb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
cbc0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
cbd0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
cbe0: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
cbf0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
cc00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
cc10: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
cc20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
cc30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
cc40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
cc50: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
cc60: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
cc70: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
cc80: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
cc90: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
cca0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
ccb0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
ccc0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
ccd0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
cce0: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
ccf0: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
cd00: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
cd10: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
cd20: 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  ll;.  usableSize
cd30: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
cd40: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  sableSize;..  /*
cd50: 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
cd60: 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20 74  les pages with t
cd70: 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65 65  wo or fewer free
cd80: 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78   blocks and nMax
cd90: 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77  Frag.  ** or few
cda0: 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  er fragmented by
cdb0: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
cdc0: 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20 74  e it is faster t
cdd0: 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20  o move the.  ** 
cde0: 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f  two (or one) blo
cdf0: 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69  cks of cells usi
ce00: 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64  ng memmove() and
ce10: 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72 65   add the require
ce20: 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74  d.  ** offsets t
ce30: 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69  o each pointer i
ce40: 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
ce50: 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69 74  er array than it
ce60: 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63   is to .  ** rec
ce70: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74  onstruct the ent
ce80: 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ire page.  */.  
ce90: 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64  if( (int)data[hd
cea0: 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29  r+7]<=nMaxFrag )
ceb0: 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65 20  {.    int iFree 
cec0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ced0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66  [hdr+1]);.    if
cee0: 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( iFree ){.     
cef0: 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20 67 65   int iFree2 = ge
cf00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
cf10: 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ee]);..      /* 
cf20: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 68  pageFindSlot() h
cf30: 61 73 20 61 6c 72 65 61 64 79 20 76 65 72 69 66  as already verif
cf40: 69 65 64 20 74 68 61 74 20 66 72 65 65 20 62 6c  ied that free bl
cf50: 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65 64 0a  ocks are sorted.
cf60: 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
cf70: 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69 74 68  r of offset with
cf80: 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61 6e 64  in the page, and
cf90: 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65   that no block e
cfa0: 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20  xtends.      ** 
cfb0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
cfc0: 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76 69 64  the page. Provid
cfd0: 65 64 20 74 68 65 20 74 77 6f 20 66 72 65 65 20  ed the two free 
cfe0: 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20  slots do not .  
cff0: 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20      ** overlap, 
d000: 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  this guarantees 
d010: 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65  that the memmove
d020: 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77  () calls below w
d030: 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  ill not.      **
d040: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 75   overwrite the u
d050: 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65 20 62  sableSize byte b
d060: 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66 20 74  uffer, even if t
d070: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
d080: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 72  .      ** is cor
d090: 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rupt.  */.      
d0a0: 61 73 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d  assert( iFree2==
d0b0: 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46 72 65  0 || iFree2>iFre
d0c0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
d0d0: 74 28 20 69 46 72 65 65 2b 67 65 74 32 62 79 74  t( iFree+get2byt
d0e0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d  e(&data[iFree+2]
d0f0: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
d100: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d110: 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46   iFree2==0 || iF
d120: 72 65 65 32 2b 67 65 74 32 62 79 74 65 28 26 64  ree2+get2byte(&d
d130: 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c  ata[iFree2+2]) <
d140: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
d150: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46  .      if( 0==iF
d160: 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46  ree2 || (data[iF
d170: 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61  ree2]==0 && data
d180: 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29  [iFree2+1]==0) )
d190: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45  {.        u8 *pE
d1a0: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
d1b0: 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
d1c0: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41  ;.        u8 *pA
d1d0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ddr;.        int
d1e0: 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   sz2 = 0;.      
d1f0: 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62    int sz = get2b
d200: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
d210: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  2]);.        int
d220: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
d230: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
d240: 20 20 20 20 20 20 20 69 66 28 20 74 6f 70 3e 3d         if( top>=
d250: 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  iFree ){.       
d260: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d270: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
d280: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
d290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d2a0: 28 20 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20  ( iFree2 ){.    
d2b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
d2c0: 72 65 65 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29  ree+sz<=iFree2 )
d2d0: 3b 20 2f 2a 20 56 65 72 69 66 69 65 64 20 62 79  ; /* Verified by
d2e0: 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20   pageFindSlot() 
d2f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32  */.          sz2
d300: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
d310: 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20  a[iFree2+2]);.  
d320: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d330: 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72  iFree+sz+sz2+iFr
d340: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c  ee2-(iFree+sz) <
d350: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
d360: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
d370: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  e(&data[iFree+sz
d380: 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72  +sz2], &data[iFr
d390: 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28  ee+sz], iFree2-(
d3a0: 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20  iFree+sz));.    
d3b0: 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b        sz += sz2;
d3c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d3d0: 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a     cbrk = top+sz
d3e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d3f0: 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f  ( cbrk+(iFree-to
d400: 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  p) <= usableSize
d410: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d   );.        memm
d420: 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  ove(&data[cbrk],
d430: 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72   &data[top], iFr
d440: 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20  ee-top);.       
d450: 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61   for(pAddr=&data
d460: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41  [cellOffset]; pA
d470: 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b  ddr<pEnd; pAddr+
d480: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  =2){.          p
d490: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
d4a0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
d4b0: 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70  f( pc<iFree ){ p
d4c0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
d4d0: 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20  c+sz); }.       
d4e0: 20 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69     else if( pc<i
d4f0: 46 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74  Free2 ){ put2byt
d500: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29  e(pAddr, pc+sz2)
d510: 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
d520: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61        goto defra
d530: 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20  gment_out;.     
d540: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
d550: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
d560: 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  e;.  iCellLast =
d570: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
d580: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
d590: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
d5a0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
d5b0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
d5c0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
d5d0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
d5e0: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
d5f0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
d600: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
d610: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
d620: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
d630: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
d640: 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  Last );.    /* T
d650: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
d660: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
d670: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
d680: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
d690: 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63    ** if PRAGMA c
d6a0: 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f  ell_size_check=O
d6b0: 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  N..    */.    if
d6c0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
d6d0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
d6e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d6f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
d700: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
d710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
d720: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
d730: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
d740: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
d750: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
d760: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
d770: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
d780: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
d790: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
d7a0: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
d7b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
d7c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d7d0: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
d7e0: 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pgno);.    }.   
d7f0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
d800: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
d810: 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  & cbrk>=iCellFir
d820: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
d830: 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75  se( cbrk+size==u
d840: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
d850: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69   testcase( pc+si
d860: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
d870: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
d880: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20  Addr, cbrk);.   
d890: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a   if( temp==0 ){.
d8a0: 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20        int x;.   
d8b0: 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20     if( cbrk==pc 
d8c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d8d0: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
d8e0: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
d8f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
d900: 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  r);.      x = ge
d910: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d920: 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  +5]);.      memc
d930: 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61  py(&temp[x], &da
d940: 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a  ta[x], (cbrk+siz
d950: 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73  e) - x);.      s
d960: 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d  rc = temp;.    }
d970: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
d980: 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63  a[cbrk], &src[pc
d990: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ], size);.  }.  
d9a0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
d9b0: 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75  .. defragment_ou
d9c0: 74 3a 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64  t:.  if( data[hd
d9d0: 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46  r+7]+cbrk-iCellF
d9e0: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
d9f0: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
da00: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
da10: 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
da20: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
da30: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
da40: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
da50: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
da60: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
da70: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
da80: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+2] = 0;.  mem
da90: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
daa0: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
dab0: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
dac0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
dad0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
dae0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
daf0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
db00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
db10: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
db20: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
db30: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
db40: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
db50: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
db60: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
db70: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
db80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
db90: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
dba0: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
dbb0: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
dbc0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
dbd0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
dbe0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
dbf0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
dc00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
dc10: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
dc20: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
dc30: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
dc40: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
dc50: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
dc60: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
dc70: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
dc80: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
dc90: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
dca0: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
dcb0: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
dcc0: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
dcd0: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
dce0: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
dcf0: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
dd00: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
dd10: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
dd20: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
dd30: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
dd40: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
dd50: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
dd60: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
dd70: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
dd80: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
dd90: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
dda0: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
ddb0: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
ddc0: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
ddd0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
dde0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
ddf0: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
de00: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
de10: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
de20: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
de30: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
de40: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  ;.  int size;   
de50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
de60: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
de70: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
de80: 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  pc>0 );.  while(
de90: 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d   pc<=usableSize-
dea0: 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  4 ){.    /* EVID
deb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
dec0: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
ded0: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
dee0: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
def0: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
df00: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
df10: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
df20: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
df30: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
df40: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
df50: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
df60: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
df70: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
df80: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
df90: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
dfa0: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
dfb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
dfc0: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
dfd0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
dfe0: 20 20 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e     if( size+pc >
dff0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
e000: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
e010: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e020: 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  O(pPg->pgno);.  
e030: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
e040: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e050: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  x<4 ){.        /
e060: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e070: 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20  -11498-58022 In 
e080: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
e090: 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74  tree page, the t
e0a0: 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  otal.        ** 
e0b0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
e0c0: 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79  in fragments may
e0d0: 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20   not exceed 60. 
e0e0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  */.        if( a
e0f0: 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29  Data[hdr+7]>57 )
e100: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20   return 0;..    
e110: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
e120: 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20  e slot from the 
e130: 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74  free-list. Updat
e140: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  e the number of.
e150: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
e160: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
e170: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
e180: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
e190: 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61  aData[iAddr], &a
e1a0: 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  Data[pc], 2);.  
e1b0: 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b        aData[hdr+
e1c0: 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20  7] += (u8)x;.   
e1d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e1e0: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
e1f0: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
e200: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
e210: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
e220: 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66  nt.         ** f
e230: 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75  or the portion u
e240: 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61  sed by the new a
e250: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  llocation. */.  
e260: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
e270: 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  aData[pc+2], x);
e280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
e290: 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20  eturn &aData[pc 
e2a0: 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  + x];.    }.    
e2b0: 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20  iAddr = pc;.    
e2c0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  pc = get2byte(&a
e2d0: 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69  Data[pc]);.    i
e2e0: 66 28 20 70 63 3c 69 41 64 64 72 2b 73 69 7a 65  f( pc<iAddr+size
e2f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
e300: 69 66 28 20 70 63 20 29 7b 0a 20 20 20 20 2a 70  if( pc ){.    *p
e310: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
e320: 55 50 54 5f 50 47 4e 4f 28 70 50 67 2d 3e 70 67  UPT_PGNO(pPg->pg
e330: 6e 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  no);.  }..  retu
e340: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
e350: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
e360: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
e370: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
e380: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
e390: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
e3a0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
e3b0: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
e3c0: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
e3d0: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
e3e0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
e3f0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
e400: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
e410: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
e420: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
e430: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
e440: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
e450: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
e460: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
e470: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
e480: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
e490: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
e4a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
e4b0: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
e4c0: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
e4d0: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
e4e0: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
e4f0: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
e500: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
e510: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
e520: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
e530: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
e540: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
e550: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
e560: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
e570: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
e580: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
e590: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
e5a0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
e5b0: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
e5c0: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
e5d0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
e5e0: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
e5f0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
e600: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
e610: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
e620: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
e630: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
e640: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
e650: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
e660: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
e670: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
e680: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
e690: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
e6a0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
e6b0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
e6e0: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
e6f0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
e700: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
e730: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
e740: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
e750: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
e760: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
e770: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
e780: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
e790: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
e7a0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
e7b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
e7c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e7d0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
e7e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e7f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
e800: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e810: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
e820: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
e830: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
e840: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
e850: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
e860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e870: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
e880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
e890: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
e8a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
e8b0: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
e8c0: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
e8d0: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
e8e0: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
e8f0: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
e900: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
e910: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
e920: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
e930: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
e940: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
e950: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
e960: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
e970: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
e980: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
e990: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
e9a0: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
e9b0: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
e9c0: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
e9d0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
e9e0: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
e9f0: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
ea00: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
ea10: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
ea20: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
ea30: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
ea40: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
ea50: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
ea60: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
ea70: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
ea80: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
ea90: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
eaa0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
eab0: 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  5]);.  assert( t
eac0: 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e  op<=(int)pPage->
ead0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
eae0: 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79  ); /* Prevent by
eaf0: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
eb00: 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74  ) */.  if( gap>t
eb10: 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f  op ){.    if( to
eb20: 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70  p==0 && pPage->p
eb30: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d  Bt->usableSize==
eb40: 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74  65536 ){.      t
eb50: 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20  op = 65536;.    
eb60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
eb70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
eb80: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
eb90: 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gno);.    }.  }.
eba0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
ebb0: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62  s enough space b
ebc0: 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74  etween gap and t
ebd0: 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20  op for one more 
ebe0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a  cell pointer.  *
ebf0: 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66  * array entry of
ec00: 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65  fset, and if the
ec10: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
ec20: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
ec30: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
ec40: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
ec50: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
ec60: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
ec70: 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e  sfy the request.
ec80: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
ec90: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
eca0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
ecb0: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
ecc0: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
ecd0: 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64  ;.  if( (data[hd
ece0: 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72  r+2] || data[hdr
ecf0: 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74  +1]) && gap+2<=t
ed00: 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53  op ){.    u8 *pS
ed10: 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53  pace = pageFindS
ed20: 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65  lot(pPage, nByte
ed30: 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
ed40: 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
ed50: 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d  assert( pSpace>=
ed60: 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20  data && (pSpace 
ed70: 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b  - data)<65536 );
ed80: 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28  .      *pIdx = (
ed90: 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61  int)(pSpace - da
eda0: 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
edb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
edc0: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b   }else if( rc ){
edd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
ede0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
edf0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f  * The request co
ee00: 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69  uld not be fulfi
ee10: 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65  lled using a fre
ee20: 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65  elist slot.  Che
ee30: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
ee40: 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f  f defragmentatio
ee50: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  n is necessary..
ee60: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
ee70: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f   gap+2+nByte==to
ee80: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
ee90: 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20  +nByte>top ){.  
eea0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
eeb0: 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52  >nCell>0 || CORR
eec0: 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63  UPT_DB );.    rc
eed0: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
eee0: 65 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20  e(pPage, MIN(4, 
eef0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28  pPage->nFree - (
ef00: 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20  2+nByte)));.    
ef10: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ef20: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
ef30: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
ef40: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
ef50: 20 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e   assert( gap+2+n
ef60: 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d  Byte<=top );.  }
ef70: 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ...  /* Allocate
ef80: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
ef90: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
efa0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
efb0: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
efc0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
efd0: 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65   area.  The btre
efe0: 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c  eInitPage() call
eff0: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a   has already.  *
f000: 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  * validated the 
f010: 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e  freelist.  Given
f020: 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69   that the freeli
f030: 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65  st is valid, the
f040: 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61  re.  ** is no wa
f050: 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  y that the alloc
f060: 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64  ation can extend
f070: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
f080: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54  the page..  ** T
f090: 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
f0a0: 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70  w verifies the p
f0b0: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
f0c0: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20  ..  */.  top -= 
f0d0: 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74  nByte;.  put2byt
f0e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
f0f0: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
f100: 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e  top+nByte <= (in
f110: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
f120: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70  ableSize );.  *p
f130: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
f140: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f150: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
f160: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
f170: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
f180: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
f190: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
f1a0: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
f1b0: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
f1c0: 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a  aData[iStart].**
f1d0: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
f1e0: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53   the block is iS
f1f0: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
f200: 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c   Adjacent freebl
f210: 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63  ocks are coalesc
f220: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ed..**.** Note t
f230: 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20  hat even though 
f240: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69  the freeblock li
f250: 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62  st was checked b
f260: 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  y btreeInitPage(
f270: 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69  ),.** that routi
f280: 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65  ne will not dete
f290: 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65  ct overlap betwe
f2a0: 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  en cells or free
f2b0: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20  blocks.  Nor.** 
f2c0: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63  does it detect c
f2d0: 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63  ells or freebloc
f2e0: 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68  ks that encrouch
f2f0: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76   into the reserv
f300: 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74  ed bytes.** at t
f310: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
f320: 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74  ge.  So do addit
f330: 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  ional corruption
f340: 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74   checks inside t
f350: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61  his.** routine a
f360: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
f370: 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20  _CORRUPT if any 
f380: 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75  problems are fou
f390: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
f3a0: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
f3b0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20  age *pPage, u16 
f3c0: 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a  iStart, u16 iSiz
f3d0: 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20  e){.  u16 iPtr; 
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f400: 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f  ddress of ptr to
f410: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
f420: 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c  */.  u16 iFreeBl
f430: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
f440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f450: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
f460: 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20  t freeblock */. 
f470: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68         /* Page h
f4a0: 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f  eader size.  0 o
f4b0: 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46  r 100 */.  u8 nF
f4c0: 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rag = 0;        
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e   /* Reduction in
f4f0: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a   fragmentation *
f500: 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a  /.  u16 iOrigSiz
f510: 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20  e = iSize;      
f520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
f530: 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69  ginal value of i
f540: 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b  Size */.  u16 x;
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
f580: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
f590: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
f5a0: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
f5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
f5c0: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
f5d0: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
f5e0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f5f0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
f600: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
f610: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
f620: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
f630: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
f640: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
f650: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
f660: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
f670: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
f680: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
f690: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
f6a0: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
f6b0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
f6c0: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
f6d0: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
f6e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
f6f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
f700: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f710: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
f720: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
f730: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
f740: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
f750: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
f760: 72 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67  rt( iStart<=pPag
f770: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
f780: 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ze-4 );..  /* Th
f790: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
f7a0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
f7b0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
f7c0: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
f7d0: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
f7e0: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
f7f0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
f800: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
f810: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f820: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
f830: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
f840: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
f850: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
f860: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
f870: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
f880: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
f890: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
f8a0: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
f8b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
f8c0: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
f8d0: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69  (&data[iPtr]))<i
f8e0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
f8f0: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
f900: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  +4 ){.        if
f910: 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20  ( iFreeBlk==0 ) 
f920: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72  break;.        r
f930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f940: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
f950: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
f960: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
f970: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
f980: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 70 50   if( iFreeBlk>pP
f990: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
f9a0: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
f9b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f9c0: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
f9d0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
f9e0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
f9f0: 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65  Blk>iPtr || iFre
fa00: 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  eBlk==0 );.  .  
fa10: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
fa20: 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46  nt:.    **    iF
fa30: 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20  reeBlk:   First 
fa40: 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20  freeblock after 
fa50: 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20  iStart, or zero 
fa60: 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20  if none.    **  
fa70: 20 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68    iPtr:       Th
fa80: 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70  e address of a p
fa90: 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42  ointer to iFreeB
faa0: 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
fab0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
fac0: 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
fad0: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
fae0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
faf0: 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
fb00: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
fb10: 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
fb20: 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
fb30: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
fb40: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
fb50: 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
fb60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fb70: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
fb80: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 45 6e  pgno);.      iEn
fb90: 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67  d = iFreeBlk + g
fba0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
fbb0: 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20  reeBlk+2]);.    
fbc0: 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61    if( iEnd > pPa
fbd0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
fbe0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
fbf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fc00: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
fc10: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
fc20: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
fc30: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
fc40: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
fc50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
fc60: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
fc70: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
fc80: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
fc90: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
fca0: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
fcb0: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
fcc0: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
fcd0: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
fce0: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
fcf0: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
fd00: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
fd10: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
fd20: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
fd30: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
fd40: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
fd50: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
fd60: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
fd70: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
fd80: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
fd90: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
fda0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
fdb0: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
fdc0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
fdd0: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
fde0: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
fdf0: 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
fe00: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
fe10: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
fe20: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
fe30: 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
fe40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
fe50: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
fe60: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
fe70: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
fe80: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
fe90: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
fea0: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20  Frag;.  }.  x = 
feb0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
fec0: 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53  dr+5]);.  if( iS
fed0: 74 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f  tart<=x ){.    /
fee0: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
fef0: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
ff00: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
ff10: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ff20: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
ff30: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
ff40: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
ff50: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
ff60: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
ff70: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
ff80: 2f 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74  /.    if( iStart
ff90: 3c 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b  <x || iPtr!=hdr+
ffa0: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
ffb0: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
ffc0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
ffd0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ffe0: 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b  hdr+1], iFreeBlk
fff0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
10000 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45  &data[hdr+5], iE
10010 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nd);.  }else{.  
10020 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
10030 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e  new freeblock in
10040 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
10050 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  */.    put2byte(
10060 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74  &data[iPtr], iSt
10070 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  art);.  }.  if( 
10080 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
10090 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
100a0 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a  SECURE ){.    /*
100b0 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
100c0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
100d0 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
100e0 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
100f0 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  .    ** option i
10100 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20  s enabled */.   
10110 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53   memset(&data[iS
10120 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29  tart], 0, iSize)
10130 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
10140 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
10150 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74  iFreeBlk);.  put
10160 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
10170 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
10180 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
10190 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
101a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
101b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
101c0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
101d0 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
101e0 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
101f0 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
10200 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
10210 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
10220 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
10230 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
10240 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
10250 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
10260 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
10270 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
10280 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
10290 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
102a0 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
102b0 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
102c0 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
102d0 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
102e0 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
102f0 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
10300 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
10310 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
10320 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
10330 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
10340 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
10350 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
10360 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
10370 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10380 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
10390 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
103a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
103b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
103c0 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
103d0 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
103e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
103f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
10400 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
10410 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
10420 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
10430 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
10440 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
10450 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
10460 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
10470 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
10480 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
10490 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
104a0 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
104b0 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
104c0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
104d0 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
104e0 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
104f0 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
10500 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
10510 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c  7291-35328 A val
10520 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d  ue of 5 (0x05) m
10530 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
10540 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
10550 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ior table b-tree
10560 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
10570 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
10580 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d  ATA|PTF_INTKEY)=
10590 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =5 );.    /* EVI
105a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30  DENCE-OF: R-2690
105b0 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20  0-09176 A value 
105c0 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61  of 13 (0x0d) mea
105d0 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
105e0 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62  .    ** leaf tab
105f0 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
10600 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
10610 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
10620 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
10630 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61  )==13 );.    pPa
10640 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
10650 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
10660 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eaf ){.      pPa
10670 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
10680 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   1;.      pPage-
10690 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
106a0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b  reeParseCellPtr;
106b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
106c0 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
106d0 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  eaf = 0;.      p
106e0 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
106f0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
10700 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
10710 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
10720 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
10730 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
10740 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
10750 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
10760 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
10770 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
10780 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
10790 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
107a0 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
107b0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
107c0 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37  E-OF: R-43316-37
107d0 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32  308 A value of 2
107e0 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68   (0x02) means th
107f0 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
10800 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64   ** interior ind
10810 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
10820 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
10830 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32  PTF_ZERODATA)==2
10840 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
10850 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d  NCE-OF: R-59615-
10860 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66  42828 A value of
10870 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73   10 (0x0a) means
10880 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20   the page is a. 
10890 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78     ** leaf index
108a0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
108b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
108c0 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c  F_ZERODATA|PTF_L
108d0 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20  EAF)==10 );.    
108e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
108f0 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  0;.    pPage->in
10900 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
10910 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
10920 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
10930 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20  CellPtrIndex;.  
10940 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
10950 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
10960 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
10970 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
10980 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
10990 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
109a0 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34  -OF: R-47608-564
109b0 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c  69 Any other val
109c0 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65  ue for the b-tre
109d0 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20  e page type is. 
109e0 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20     ** an error. 
109f0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
10a00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
10a10 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
10a20 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
10a30 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
10a40 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
10a50 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
10a60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10a70 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
10a80 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
10a90 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
10aa0 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
10ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10ac0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
10ad0 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
10ae0 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
10af0 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
10b00 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
10b10 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
10b20 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
10b30 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
10b40 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
10b50 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
10b60 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
10b70 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
10b80 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
10b90 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
10ba0 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
10bb0 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
10bc0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10bd0 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67  int btreeInitPag
10be0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
10bf0 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  ){.  int pc;    
10c00 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10c10 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
10c20 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
10c30 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20  aData[] */.  u8 
10c40 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
10c50 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
10c60 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
10c70 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  eader */.  u8 *d
10c80 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
10c90 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
10ca0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68  >aData */.  BtSh
10cb0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
10cc0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
10cd0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
10ce0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
10cf0 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
10d00 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
10d10 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
10d20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
10d30 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
10d40 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
10d50 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
10d60 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
10d70 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
10d80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
10d90 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
10da0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74   page */.  int t
10db0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
10dc0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
10dd0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
10de0 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43  area */.  int iC
10df0 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
10e00 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
10e10 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
10e20 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  k offset */.  in
10e30 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
10e40 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
10e50 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
10e60 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
10e70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10e80 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
10e90 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
10ea0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
10eb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10ec0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
10ed0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
10ee0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
10ef0 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
10f00 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
10f10 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
10f20 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
10f30 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10f40 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
10f50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
10f60 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
10f70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10f80 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
10f90 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
10fa0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
10fb0 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20  ==0 );..  pBt = 
10fc0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68 64  pPage->pBt;.  hd
10fd0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
10fe0 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
10ff0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f  Page->aData;.  /
11000 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11010 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
11020 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
11030 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
11040 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62  ating.  ** the b
11050 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e  -tree page type.
11060 20 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64 65   */.  if( decode
11070 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
11080 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20 20 20 72  a[hdr]) ){.    r
11090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
110a0 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
110b0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73  >pgno);.  }.  as
110c0 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
110d0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
110e0 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
110f0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
11100 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
11110 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
11120 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
11130 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75 73 61 62  flow = 0;.  usab
11140 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
11150 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  ableSize;.  pPag
11160 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
11170 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
11180 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
11190 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70 50  ildPtrSize;.  pP
111a0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
111b0 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
111c0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  ];.  pPage->aCel
111d0 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c  lIdx = &data[cel
111e0 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70 50 61 67  lOffset];.  pPag
111f0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
11200 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
11210 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20  dPtrSize];.  /* 
11220 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
11230 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74  8015-48175 The t
11240 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
11250 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69  at offset 5 desi
11260 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20  gnates.  ** the 
11270 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
11280 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
11290 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72  A zero value for
112a0 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73   this integer is
112b0 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65  .  ** interprete
112c0 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
112d0 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
112e0 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
112f0 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  +5]);.  /* EVIDE
11300 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d  NCE-OF: R-37002-
11310 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79  32774 The two-by
11320 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
11330 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65  fset 3 gives the
11340 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
11350 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
11360 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e  e. */.  pPage->n
11370 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
11380 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
11390 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
113a0 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
113b0 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79  {.    /* To many
113c0 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
113d0 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
113e0 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
113f0 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
11400 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11410 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
11420 6f 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  o);.  }.  testca
11430 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
11440 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
11450 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
11460 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37  OF: R-24089-5797
11470 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74  9 If a page cont
11480 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77  ains no cells (w
11490 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a  hich is only.  *
114a0 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  * possible for a
114b0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
114c0 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
114d0 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65  ins no rows) the
114e0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65  n the.  ** offse
114f0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
11500 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20  ntent area will 
11510 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73  equal the page s
11520 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20  ize minus the.  
11530 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
11540 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
11550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11560 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d  nCell>0 || top==
11570 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f  usableSize || CO
11580 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f  RRUPT_DB );..  /
11590 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
115a0 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
115b0 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
115c0 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
115d0 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
115e0 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
115f0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
11600 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
11610 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73  k of code checks
11620 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66   early to see if
11630 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a   a cell extends.
11640 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
11650 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e  d of a page boun
11660 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20  dary and causes 
11670 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74  SQLITE_CORRUPT t
11680 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65 74 75 72  o be .  ** retur
11690 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
116a0 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73    */.  iCellFirs
116b0 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
116c0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
116d0 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75  .  iCellLast = u
116e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
116f0 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c   if( pBt->db->fl
11700 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c  ags & SQLITE_Cel
11710 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69  lSizeCk ){.    i
11720 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11730 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
11740 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
11750 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
11760 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f   sz;           /
11770 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
11780 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21 70 50   */..    if( !pP
11790 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
117a0 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72  lLast--;.    for
117b0 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
117c0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
117d0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
117e0 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
117f0 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
11800 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
11810 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
11820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11830 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
11840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
11850 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
11860 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
11870 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11880 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
11890 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
118a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d      }.      sz =
118b0 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
118c0 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  e(pPage, &data[p
118d0 63 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  c]);.      testc
118e0 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62  ase( pc+sz==usab
118f0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
11900 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
11910 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
11920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11930 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
11940 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
11950 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
11960 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
11970 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20 20  ellLast++;.  }  
11980 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
11990 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
119a0 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  ace on the page.
119b0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
119c0 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20  : R-23588-34450 
119d0 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
119e0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31  eger at offset 1
119f0 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20   gives the.  ** 
11a00 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
11a10 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
11a20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
11a30 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
11a40 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c  e no.  ** freebl
11a50 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20  ocks. */.  pc = 
11a60 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
11a70 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20  dr+1]);.  nFree 
11a80 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
11a90 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46  top;  /* Init nF
11aa0 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62  ree to non-freeb
11ab0 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20  lock free space 
11ac0 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29 7b  */.  if( pc>0 ){
11ad0 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73  .    u32 next, s
11ae0 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  ize;.    if( pc<
11af0 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20  iCellFirst ){.  
11b00 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
11b10 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33  OF: R-55530-5293
11b20 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  0 In a well-form
11b30 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
11b40 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20  there will.     
11b50 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
11b60 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
11b70 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
11b80 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
11b90 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
11ba0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11bb0 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
11bc0 6f 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77  o); .    }.    w
11bd0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
11be0 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73   if( pc>iCellLas
11bf0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
11c00 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68  Freeblock off th
11c10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
11c20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
11c30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11c40 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
11c50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
11c60 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
11c70 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
11c80 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
11c90 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
11ca0 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20  ]);.      nFree 
11cb0 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
11cc0 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3c 3d        if( next<=
11cd0 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72 65 61  pc+size+3 ) brea
11ce0 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  k;.      pc = ne
11cf0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
11d00 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ( next>0 ){.    
11d10 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e    /* Freeblock n
11d20 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ot in ascending 
11d30 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72  order */.      r
11d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11d50 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
11d60 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  >pgno);.    }.  
11d70 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75    if( pc+size>(u
11d80 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62  nsigned int)usab
11d90 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
11da0 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63  /* Last freebloc
11db0 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70  k extends past p
11dc0 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20  age end */.     
11dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11de0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
11df0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
11e00 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
11e10 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
11e20 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
11e30 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
11e40 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
11e50 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
11e60 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68  ent area plus th
11e70 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
11e80 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20   bytes within.  
11e90 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
11ea0 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
11eb0 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
11ec0 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
11ed0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61  e.  ** of the pa
11ee0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
11ef0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
11f00 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
11f10 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73  also.  ** serves
11f20 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
11f30 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
11f40 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
11f50 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  ell-content.  **
11f60 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
11f70 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
11f80 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
11f90 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a   the page..  */.
11fa0 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62    if( nFree>usab
11fb0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  leSize ){.    re
11fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11fd0 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
11fe0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 70 50 61  pgno);.  }.  pPa
11ff0 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
12000 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
12010 69 72 73 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e  irst);.  pPage->
12020 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65  isInit = 1;.  re
12030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12040 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
12050 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
12060 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
12070 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
12080 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
12090 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
120a0 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
120b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
120c0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
120d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
120e0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
120f0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12100 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
12110 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
12120 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
12130 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
12140 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12150 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
12160 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
12170 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
12180 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12190 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
121a0 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
121b0 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
121c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
121d0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
121e0 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
121f0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12200 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
12210 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
12220 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
12230 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12240 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
12250 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
12260 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
12270 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
12280 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
12290 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
122a0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
122b0 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
122c0 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
122d0 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
122e0 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
122f0 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
12300 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
12310 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
12320 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
12330 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
12340 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
12350 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
12360 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
12370 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
12380 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
12390 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
123a0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
123b0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
123c0 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
123d0 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
123e0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
123f0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
12400 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
12410 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
12420 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
12430 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
12440 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
12450 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
12460 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12470 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
12480 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
12490 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
124a0 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
124b0 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
124c0 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
124d0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
124e0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
124f0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
12500 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
12510 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
12520 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
12530 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
12540 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
12550 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
12560 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
12570 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
12580 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
12590 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
125a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
125b0 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
125c0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
125d0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
125e0 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70  ( pgno!=pPage->p
125f0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
12600 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
12610 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
12620 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67  bPage);.    pPag
12630 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
12640 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Page;.    pPage-
12650 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
12660 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
12670 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68  no;.    pPage->h
12680 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
12690 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
126a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
126b0 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  e->aData==sqlite
126c0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
126d0 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
126e0 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
126f0 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
12700 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
12710 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
12720 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
12730 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
12740 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
12750 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62  ed.  See also: b
12760 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
12770 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
12780 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
12790 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65  NTENT flag is se
127a0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
127b0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   we do not care.
127c0 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  ** about the con
127d0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
127e0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
127f0 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
12800 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
12810 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
12820 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
12830 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
12840 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
12850 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
12860 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
12870 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
12880 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
12890 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
128a0 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
128b0 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
128c0 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
128d0 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
128e0 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
128f0 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
12900 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
12910 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
12920 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
12930 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
12940 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
12950 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12960 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
12970 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
12980 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
12990 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
129a0 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
129b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
129c0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
129d0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
129e0 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
129f0 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
12a00 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
12a10 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
12a20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
12a30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
12a40 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c  _GET_NOCONTENT |
12a50 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
12a60 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20  ET_READONLY );. 
12a70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12a80 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12a90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
12aa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
12ab0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
12ac0 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
12ad0 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
12ae0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
12af0 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
12b00 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
12b10 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
12b20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
12b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12b40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
12b50 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
12b60 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
12b70 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
12b80 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
12b90 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
12ba0 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
12bb0 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
12bc0 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
12bd0 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
12be0 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
12bf0 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
12c00 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
12c10 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
12c20 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
12c30 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
12c40 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
12c50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12c60 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
12c70 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
12c80 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
12c90 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
12ca0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
12cb0 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
12cc0 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
12cd0 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
12ce0 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
12cf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
12d00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
12d10 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
12d30 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
12d40 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
12d50 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
12d60 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
12d70 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
12d80 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
12d90 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
12da0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
12db0 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
12dc0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
12dd0 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
12de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
12df0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
12e00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
12e10 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
12e20 30 78 38 30 30 30 30 30 30 30 29 3d 3d 30 20 29  0x80000000)==0 )
12e30 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
12e40 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
12e50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
12e60 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
12e70 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
12e80 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  lize it..**.** I
12e90 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74  f pCur!=0 then t
12ea0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
12eb0 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74   fetched as part
12ec0 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   of a moveToChil
12ed0 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f  d().** call.  Do
12ee0 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
12ef0 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
12f00 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
12f10 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20  case..** And if 
12f20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c  the fetch fails,
12f30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   this routine mu
12f40 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75  st decrement pCu
12f50 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  r->iPage..**.** 
12f60 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63  The page is fetc
12f70 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74  hed as read-writ
12f80 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73  e unless pCur is
12f90 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73   not NULL and is
12fa0 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  .** a read-only 
12fb0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
12fc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12fd0 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
12fe0 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
12ff0 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
13000 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
13010 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
13020 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
13030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
13040 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
13050 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13070 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
13080 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
13090 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
130a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
130b0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
130c0 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
130d0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
130e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
130f0 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
13100 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42  nter here */.  B
13110 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13130 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65  * Cursor to rece
13140 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72  ive the page, or
13150 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62   NULL */.  int b
13160 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20  ReadOnly        
13170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
13180 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
13190 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ly page */.){.  
131a0 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
131b0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
131c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
131d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
131e0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
131f0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61   pCur==0 || ppPa
13200 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61 67 65  ge==&pCur->pPage
13210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
13220 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
13230 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
13240 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
13250 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
13260 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
13270 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
13280 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
13290 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
132a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
132b0 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
132c0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
132d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
132e0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
132f0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
13300 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
13310 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
13320 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
13330 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
13340 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
13350 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
13360 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
13370 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
13380 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
13390 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
133a0 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
133b0 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
133c0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
133d0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
133e0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
133f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
13410 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
13420 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
13430 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
13440 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
13450 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
13460 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
13470 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
13480 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
13490 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
134a0 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
134b0 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
134c0 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
134d0 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
134e0 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
134f0 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
13500 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
13510 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
13520 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
13530 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
13540 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
13550 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
13560 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
13570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13580 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f  ORRUPT_PGNO(pgno
13590 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
135a0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
135b0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
135c0 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
135d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
135e0 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50  OK;..getAndInitP
135f0 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  age_error:.  if(
13600 20 70 43 75 72 20 29 7b 0a 20 20 20 20 70 43 75   pCur ){.    pCu
13610 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
13620 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
13630 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
13640 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74  >iPage];.  }.  t
13650 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
13660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
13670 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
13680 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
13690 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
136a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
136b0 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a  IT_CONCURRENT./*
136c0 20 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c   .** Set the val
136d0 75 65 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ue of the MemPag
136e0 65 2e 70 67 6e 6f 52 6f 6f 74 20 76 61 72 69 61  e.pgnoRoot varia
136f0 62 6c 65 2c 20 69 66 20 69 74 20 65 78 69 73 74  ble, if it exist
13700 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
13710 64 20 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74  d setMempageRoot
13720 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 75  (MemPage *pPg, u
13730 33 32 20 70 67 6e 6f 52 6f 6f 74 29 7b 0a 20 20  32 pgnoRoot){.  
13740 70 50 67 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  pPg->pgnoRoot = 
13750 70 67 6e 6f 52 6f 6f 74 3b 0a 7d 0a 23 65 6c 73  pgnoRoot;.}.#els
13760 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 4d 65  e.# define setMe
13770 6d 70 61 67 65 52 6f 6f 74 28 78 2c 79 29 0a 23  mpageRoot(x,y).#
13780 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
13790 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
137a0 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
137b0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
137c0 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
137d0 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
137e0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20  ge..**.** Page1 
137f0 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  is a special cas
13800 65 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  e and must be re
13810 6c 65 61 73 65 64 20 75 73 69 6e 67 20 72 65 6c  leased using rel
13820 65 61 73 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a  easePageOne()..*
13830 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
13840 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
13850 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
13860 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
13870 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
13880 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
13890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
138a0 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
138b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
138c0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
138d0 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
138e0 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
138f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
13900 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
13910 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
13920 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
13930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13940 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13950 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
13960 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
13970 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
13980 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
13990 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
139a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
139b0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
139c0 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
139d0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
139e0 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
139f0 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
13a00 4f 6e 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  One(MemPage *pPa
13a10 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
13a20 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
13a30 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
13a40 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
13a50 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
13a60 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
13a70 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
13a80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13a90 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
13aa0 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
13ab0 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
13ac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13ad0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
13ae0 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
13af0 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
13b00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13b10 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
13b20 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
13b30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
13b40 72 65 66 50 61 67 65 4f 6e 65 28 70 50 61 67 65  refPageOne(pPage
13b50 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ->pDbPage);.}../
13b60 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
13b70 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
13b80 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
13b90 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
13ba0 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
13bb0 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
13bc0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
13bd0 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
13be0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
13bf0 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
13c00 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
13c10 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
13c20 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
13c30 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
13c40 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
13c50 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
13c60 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
13c70 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
13c80 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
13c90 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
13ca0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
13cb0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
13cc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13cd0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
13ce0 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
13cf0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
13d00 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
13d10 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
13d20 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
13d30 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
13d40 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
13d50 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
13d60 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
13d70 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
13d80 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
13d90 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
13da0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
13db0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
13dc0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
13dd0 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
13de0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
13df0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
13e00 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
13e10 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
13e20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
13e30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
13e40 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
13e50 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
13e60 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
13e70 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
13e80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13e90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
13ea0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
13eb0 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
13ec0 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
13ed0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
13ee0 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
13ef0 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
13f00 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
13f10 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
13f20 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
13f30 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
13f40 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
13f50 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
13f60 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
13f70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
13f80 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
13f90 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
13fa0 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
13fb0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
13fc0 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
13fd0 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
13fe0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
13ff0 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
14000 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
14010 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
14020 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
14030 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
14040 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
14050 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
14060 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
14070 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
14080 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
14090 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
140a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
140b0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
140c0 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
140d0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
140e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
140f0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
14100 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
14110 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
14120 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
14130 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
14140 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
14150 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
14160 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
14170 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
14180 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
14190 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
141a0 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
141b0 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
141c0 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
141d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
141e0 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
141f0 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
14200 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
14210 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
14220 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
14230 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
14240 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
14250 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
14260 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
14270 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
14280 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
14290 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
142a0 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
142b0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
142c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
142d0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
142e0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
142f0 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
14300 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
14310 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
14320 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
14330 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
14340 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
14350 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
14360 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
14370 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14380 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
14390 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
143a0 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
143b0 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
143c0 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
143d0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
143e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
143f0 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
14400 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
14410 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14420 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
14430 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61  s NULL.** then a
14440 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  n ephemeral data
14450 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e  base is created.
14460 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20    The ephemeral 
14470 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a  database might.*
14480 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79  * be exclusively
14490 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69   in memory, or i
144a0 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69  t might use a di
144b0 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20  sk-based memory 
144c0 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72  cache..** Either
144d0 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65   way, the epheme
144e0 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c  ral database wil
144f0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
14500 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77  ly deleted .** w
14510 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
14520 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
14530 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
14540 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
14550 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
14560 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
14570 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
14580 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
14590 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
145a0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
145b0 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73  **.** The "flags
145c0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
145d0 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69   bitmask that mi
145e0 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73  ght contain bits
145f0 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f   like.** BTREE_O
14600 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f  MIT_JOURNAL and/
14610 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e  or BTREE_MEMORY.
14620 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
14630 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
14640 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
14650 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
14660 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
14670 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
14680 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
14690 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
146a0 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
146b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
146c0 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
146d0 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
146e0 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
146f0 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
14700 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
14710 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
14720 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
14730 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
14740 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
14750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14760 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  reeOpen(.  sqlit
14770 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
14780 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
14790 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65   for this b-tree
147a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
147b0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
147c0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
147d0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
147e0 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
147f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14800 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
14810 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
14820 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
14830 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
14840 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14850 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
14860 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
14870 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
14880 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
14890 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
148a0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
148b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
148c0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
148d0 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
148e0 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
148f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14900 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
14910 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
14920 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
14930 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
14960 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
14970 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
14980 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
14990 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
149a0 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
149b0 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
149c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
149d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
149e0 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
149f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
14a00 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
14a30 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
14a40 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
14a50 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
14a60 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
14a70 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
14a80 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
14a90 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
14aa0 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
14ab0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
14ac0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
14ad0 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
14ae0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
14af0 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
14b00 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
14b10 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
14b20 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
14b30 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
14b40 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
14b50 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
14b60 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
14b70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
14b80 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
14b90 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
14ba0 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
14bb0 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
14bc0 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
14bd0 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
14be0 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
14c10 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
14c20 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20  nMemory(db)).   
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73      || (vfsFlags
14c50 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
14c60 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69  EMORY)!=0;.#endi
14c70 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
14c80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14c90 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pVfs!=0 );.  ass
14ca0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14cb0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
14cc0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
14cd0 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c  (flags&0xff)==fl
14ce0 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67  ags );   /* flag
14cf0 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20  s fit in 8 bits 
14d00 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20  */..  /* Only a 
14d10 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
14d20 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52  abase can be BTR
14d30 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a  EE_UNORDERED */.
14d40 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
14d50 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52   & BTREE_UNORDER
14d60 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  ED)==0 || (flags
14d70 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
14d80 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42  !=0 );..  /* A B
14d90 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
14da0 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61  base is always a
14db0 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f   temporary and/o
14dc0 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20  r ephemeral */. 
14dd0 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
14de0 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d  & BTREE_SINGLE)=
14df0 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29  =0 || isTempDb )
14e00 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  ;..  if( isMemdb
14e10 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
14e20 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
14e30 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
14e40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
14e50 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
14e60 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
14e70 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
14e80 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
14e90 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
14ea0 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
14eb0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
14ec0 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
14ed0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
14ee0 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
14ef0 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
14f00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14f10 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e  _BKPT;.  }.  p->
14f20 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
14f30 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
14f40 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
14f50 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14f60 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
14f70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
14f80 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
14f90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
14fa0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14fb0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
14fc0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
14fd0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
14fe0 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
14ff0 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
15000 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
15010 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
15020 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
15030 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
15040 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
15050 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
15060 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
15070 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
15080 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
15090 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
150a0 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
150b0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
150c0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
150d0 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
150e0 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
150f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
15100 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
15110 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
15120 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
15130 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
15140 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
15150 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
15160 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
15170 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
15180 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
15190 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
151a0 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
151b0 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
151c0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
151d0 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
151e0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
151f0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
15200 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15210 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
15220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15230 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
15240 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75        memcpy(zFu
15250 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c  llPathname, zFil
15260 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65  ename, nFilename
15270 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15280 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
15290 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
152a0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
152b0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68         nFullPath
152e0 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
152f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
15300 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
15310 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
15320 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
15330 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15340 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
15350 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15370 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
15380 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74  ADSAFE.      mut
15390 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
153a0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
153b0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
153c0 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
153d0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
153e0 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
153f0 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
15400 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
15410 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
15420 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
15430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
15440 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
15450 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ared);.#endif.  
15460 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
15470 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15480 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15490 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
154a0 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
154b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
154c0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
154d0 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
154e0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
154f0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
15500 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
15510 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  , 0)).          
15520 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
15530 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
15540 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
15550 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
15560 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
15570 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
15580 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
15590 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
155a0 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
155b0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
155c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
155d0 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
155e0 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
155f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
15600 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15610 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
15620 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
15630 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15640 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
15650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
15660 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
15670 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
15680 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15690 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
156a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
156b0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
156c0 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
156d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
156e0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
156f0 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
15700 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
15710 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
15740 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
15750 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
15760 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
15770 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
15780 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
15790 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
157a0 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
157b0 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
157c0 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
157d0 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
157e0 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
157f0 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
15800 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
15810 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
15820 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
15830 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
15840 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
15850 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
15860 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
15870 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
15880 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
15890 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
158a0 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
158b0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
158c0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
158d0 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
158e0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
158f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
15900 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
15910 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
15920 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
15930 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
15940 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
15950 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
15960 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
15970 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
15980 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
15990 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
159a0 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
159b0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
159c0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
159d0 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73  4)==8 );.    ass
159e0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
159f0 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
15a00 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
15a10 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
15a20 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
15a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
15a40 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
15a50 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
15a60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
15a70 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
15a80 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
15a90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
15aa0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
15ab0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
15ac0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
15ad0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
15ae0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
15af0 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
15b00 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d        sizeof(Mem
15b30 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66  Page), flags, vf
15b40 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
15b50 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
15b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15b70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15b80 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
15b90 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a  ->pPager, db->sz
15ba0 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
15bb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
15bc0 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
15bd0 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
15be0 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
15bf0 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
15c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15c10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
15c20 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
15c30 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
15c40 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
15c50 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
15c60 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
15c70 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
15c80 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
15c90 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
15ca0 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
15cb0 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
15cc0 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
15cd0 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
15ce0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
15cf0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
15d00 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
15d10 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
15d20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
15d30 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
15d40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
15d50 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
15d60 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  E).    pBt->btsF
15d70 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
15d80 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66  RE_DELETE;.#elif
15d90 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15da0 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c 45  FAST_SECURE_DELE
15db0 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  TE).    pBt->bts
15dc0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45  Flags |= BTS_OVE
15dd0 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20  RWRITE;.#endif. 
15de0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
15df0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
15e00 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
15e10 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
15e20 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
15e30 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
15e40 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
15e50 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
15e60 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
15e70 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
15e80 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
15e90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
15ea0 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  /.    pBt->pageS
15eb0 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
15ec0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
15ed0 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
15ee0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
15ef0 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
15f00 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
15f10 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
15f20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
15f30 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
15f40 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
15f50 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
15f60 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
15f70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15f80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
15f90 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
15fa0 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
15fb0 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
15fc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
15fd0 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
15fe0 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
15ff0 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
16000 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
16010 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
16020 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
16030 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
16040 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
16050 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
16060 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
16070 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
16080 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
16090 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
160a0 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
160b0 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
160c0 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
160d0 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
160e0 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
160f0 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
16100 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
16110 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
16120 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
16130 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
16140 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
16150 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
16160 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
16170 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
16180 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
16190 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
161a0 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
161b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
161c0 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
161d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
161e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
161f0 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
16200 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
16210 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
16220 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
16230 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
16240 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
16250 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
16260 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
16270 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
16280 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
16290 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65  er. */.      nRe
162a0 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
162b0 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
162c0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
162d0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
162e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
162f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
16300 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
16310 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
16320 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
16330 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
16340 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
16350 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
16360 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
16370 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
16380 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
16390 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
163a0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
163b0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
163c0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
163d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
163e0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
163f0 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
16400 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
16410 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
16420 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
16430 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
16440 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
16450 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
16460 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
16470 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
16480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
16490 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
164a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
164b0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
164c0 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
164d0 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
164e0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
164f0 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
16500 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
16510 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
16520 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
16530 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
16540 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
16550 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
16560 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45  ed; ).      MUTE
16570 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
16580 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
16590 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
165a0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
165b0 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
165c0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
165d0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
165e0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
165f0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
16600 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
16610 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
16620 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
16630 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16640 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
16650 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
16660 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
16670 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
16680 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
16690 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
166a0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
166b0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
166c0 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
166d0 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
166e0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
166f0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16700 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
16710 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
16720 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16730 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
16740 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
16750 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
16760 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
16770 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
16780 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16790 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
167a0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
167b0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
167c0 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
167d0 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
167e0 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
167f0 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
16800 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
16810 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
16820 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
16830 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
16840 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
16850 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
16860 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
16870 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
16880 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
16890 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
168a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
168b0 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
168c0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
168d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
168e0 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
168f0 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
16900 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
16910 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
16920 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
16930 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
16940 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
16950 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28  ( (uptr)p->pBt<(
16960 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29  uptr)pSib->pBt )
16970 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
16980 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
16990 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
169a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
169b0 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
169c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
169d0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
169e0 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28  pSib->pNext && (
169f0 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74  uptr)pSib->pNext
16a00 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70  ->pBt<(uptr)p->p
16a10 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
16a20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
16a30 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
16a40 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
16a50 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
16a60 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
16a70 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
16a80 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
16a90 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
16aa0 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
16ab0 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
16ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16ad0 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
16ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16af0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16b00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
16b10 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
16b20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
16b30 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
16b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16b50 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
16b60 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
16b70 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
16b80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
16b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16ba0 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
16bb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16bc0 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
16bd0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
16be0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
16bf0 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  *pFile;..    /* 
16c00 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
16c10 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
16c20 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
16c30 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
16c40 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
16c50 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
16c60 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
16c70 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
16c80 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
16c90 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
16ca0 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
16cb0 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
16cc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
16cd0 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
16ce0 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
16cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
16d00 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
16d10 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
16d20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
16d30 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
16d40 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73  }..    pFile = s
16d50 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
16d60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
16d70 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
16d80 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73  thods ){.      s
16d90 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
16da0 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53  rolHint(pFile, S
16db0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c  QLITE_FCNTL_PDB,
16dc0 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62   (void*)&pBt->db
16dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
16de0 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
16df0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
16e00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
16e10 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
16e20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
16e30 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
16e40 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
16e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
16e60 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e  sqlite3BtreeConn
16e70 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42  ectionCount(*ppB
16e80 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74  tree)>0 );.  ret
16e90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16ea0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
16eb0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
16ec0 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
16ed0 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
16ee0 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
16ef0 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
16f00 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
16f10 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
16f20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
16f30 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
16f40 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
16f50 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
16f60 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
16f70 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
16f80 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
16f90 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
16fa0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
16fb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16fc0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
16fd0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
16fe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
16ff0 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
17000 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
17010 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
17020 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17030 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
17040 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17050 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
17060 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
17070 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
17080 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
17090 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
170a0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
170b0 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
170c0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
170d0 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
170e0 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
170f0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
17100 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
17110 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
17120 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
17130 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
17140 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
17150 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
17160 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
17170 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
17180 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
17190 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
171a0 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
171b0 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
171c0 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
171d0 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
171e0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
171f0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
17200 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
17210 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
17220 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
17230 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17240 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
17250 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
17260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
17270 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
17280 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
17290 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
172a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
172b0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
172c0 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
172d0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
172e0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
172f0 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
17300 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
17310 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
17320 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
17330 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74  E(pBt) bytes wit
17340 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69  h a 4-byte prefi
17350 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69  x for a left-chi
17360 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ld.** pointer..*
17370 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
17380 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
17390 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
173a0 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
173b0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
173c0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
173d0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
173e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
173f0 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
17400 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
17410 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
17420 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
17430 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
17440 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
17450 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
17460 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
17470 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
17480 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
17490 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
174a0 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
174b0 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
174c0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
174d0 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
174e0 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
174f0 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
17500 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
17510 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
17520 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
17530 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
17540 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
17550 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
17560 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
17570 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
17580 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
17590 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
175a0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
175b0 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
175c0 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
175d0 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
175e0 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
175f0 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
17600 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
17610 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
17620 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
17630 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
17640 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
17650 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
17660 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
17670 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
17680 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
17690 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  here..    **.   
176a0 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69   ** Also:  Provi
176b0 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  de four bytes of
176c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61   initialized spa
176d0 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ce before the.  
176e0 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f    ** beginning o
176f0 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61  f pTmpSpace as a
17700 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65  n area available
17710 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a   to prepend the.
17720 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c      ** left-chil
17730 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
17740 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
17750 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
17760 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
17770 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ace ){.      mem
17780 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
17790 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ce, 0, 8);.     
177a0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
177b0 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 4;.    }.  }.
177c0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
177d0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
177e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
177f0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
17800 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
17810 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70  d *pBt){.  if( p
17820 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
17830 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
17840 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71  ace -= 4;.    sq
17850 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42  lite3PageFree(pB
17860 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
17870 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
17880 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
17890 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
178a0 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
178b0 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
178c0 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
178d0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
178e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
178f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17900 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
17910 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
17920 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
17930 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
17940 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
17950 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17960 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
17970 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
17980 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17990 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
179a0 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
179b0 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
179c0 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
179d0 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
179e0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
179f0 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
17a00 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
17a10 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
17a20 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
17a30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
17a40 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
17a50 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
17a60 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
17a70 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
17a80 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
17a90 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
17aa0 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
17ab0 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
17ac0 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
17ad0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
17ae0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
17af0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
17b00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17b10 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
17b20 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
17b30 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
17b40 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
17b50 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
17b60 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
17b70 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
17b80 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
17b90 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
17ba0 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
17bb0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
17bc0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17bd0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
17be0 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
17bf0 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
17c00 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
17c10 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
17c20 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
17c30 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
17c40 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
17c50 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
17c60 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
17c70 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
17c80 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
17c90 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
17ca0 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
17cb0 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
17cc0 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
17cd0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
17ce0 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
17cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
17d00 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
17d10 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20  ger, p->db);.   
17d20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
17d30 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
17d40 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
17d50 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
17d60 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
17d70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17d80 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70  DbFree(0, pBt->p
17d90 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
17da0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
17db0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17dc0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
17dd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17de0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
17df0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
17e00 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
17e10 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
17e20 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
17e30 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
17e40 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
17e50 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
17e60 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
17e70 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
17e80 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
17e90 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
17ea0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17eb0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
17ec0 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20  he "soft" limit 
17ed0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
17ee0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
17ef0 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61  che..** Unused a
17f00 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61  nd unmodified pa
17f10 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79  ges will be recy
17f20 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  cled when the nu
17f30 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73  mber of.** pages
17f40 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65 78   in the cache ex
17f50 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74 20  ceeds this soft 
17f60 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20  limit.  But the 
17f70 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
17f80 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ache is allowed 
17f90 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74  to grow larger t
17fa0 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69  han this limit i
17fb0 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  f it contains.**
17fc0 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72 20   dirty pages or 
17fd0 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61  pages still in a
17fe0 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ctive use..*/.in
17ff0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18000 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
18010 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
18020 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
18030 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
18040 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18050 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
18060 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
18070 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18080 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
18090 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
180a0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
180b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
180c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
180d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
180e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
180f0 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74  he "spill" limit
18100 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
18110 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
18120 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ache..** If the 
18130 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
18140 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d  exceeds this lim
18150 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69 74  it during a writ
18160 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  e transaction,.*
18170 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67 68  * the pager migh
18180 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70  t attempt to "sp
18190 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68  ill" pages to th
181a0 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20  e journal early 
181b0 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66  in.** order to f
181c0 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a  ree up memory..*
181d0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
181e0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 63  eturned is the c
181f0 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
18200 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70  e.  If zero is p
18210 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61  assed.** as an a
18220 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e  rgument, no chan
18230 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
18240 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73  the spill size s
18250 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73  etting, so.** us
18260 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20  ing mxPage of 0 
18270 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65 72  is a way to quer
18280 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  y the current sp
18290 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74  ill size..*/.int
182a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
182b0 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20  SpillSize(Btree 
182c0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
182d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
182e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
182f0 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
18300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18310 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
18320 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
18330 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65  eeEnter(p);.  re
18340 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  s = sqlite3Pager
18350 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74  SetSpillsize(pBt
18360 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
18370 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18380 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18390 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20  urn res;.}..#if 
183a0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
183b0 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
183c0 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
183d0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
183e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
183f0 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
18400 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
18410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18420 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
18430 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
18440 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
18450 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18460 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
18470 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18480 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
18490 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
184a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
184b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
184c0 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
184d0 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
184e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
184f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18500 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
18510 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18520 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
18530 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
18540 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
18550 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
18560 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
18570 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
18580 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
18590 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
185a0 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
185b0 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
185c0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
185d0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
185e0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
185f0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
18600 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
18610 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
18620 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
18630 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
18640 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
18650 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
18660 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
18670 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
18680 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
18690 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
186a0 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
186b0 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
186c0 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
186d0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
186e0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
186f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18700 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
18710 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
18720 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
18730 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
18740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18750 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
18760 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
18770 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
18780 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
18790 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
187a0 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
187b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
187c0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
187d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
187e0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
187f0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
18800 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18810 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
18820 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
18830 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
18840 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18850 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
18860 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
18870 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
18880 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
18890 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
188a0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
188b0 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
188c0 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
188d0 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
188e0 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
188f0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
18900 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
18910 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
18920 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
18930 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
18940 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
18950 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
18960 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
18970 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
18980 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
18990 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
189a0 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
189b0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
189c0 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
189d0 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
189e0 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
189f0 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
18a00 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
18a10 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
18a20 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
18a30 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
18a40 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
18a50 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
18a60 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
18a70 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
18a80 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
18a90 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
18aa0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
18ab0 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
18ac0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
18ad0 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
18ae0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
18af0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
18b00 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
18b10 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
18b20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
18b30 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
18b40 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47  then the BTS_PAG
18b50 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67  ESIZE_FIXED flag
18b60 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
18b70 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
18b80 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
18b90 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
18ba0 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
18bb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18bc0 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
18bd0 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
18be0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
18bf0 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
18c00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18c10 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
18c20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
18c30 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
18c40 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
18c50 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
18c60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18c70 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ;.#if SQLITE_HAS
18c80 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65  _CODEC.  if( nRe
18c90 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d  serve>pBt->optim
18ca0 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d  alReserve ) pBt-
18cb0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
18cc0 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a  = (u8)nReserve;.
18cd0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
18ce0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
18cf0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
18d00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
18d10 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
18d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
18d30 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
18d40 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
18d50 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
18d60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
18d70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
18d80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
18d90 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
18da0 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
18db0 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
18dc0 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
18dd0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
18de0 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
18df0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
18e00 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
18e10 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
18e20 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
18e30 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
18e40 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
18e50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
18e60 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u32)pageSize;. 
18e70 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
18e80 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
18e90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
18ea0 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
18eb0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
18ec0 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
18ed0 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
18ee0 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
18ef0 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
18f00 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
18f10 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
18f20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
18f30 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  FIXED;.  sqlite3
18f40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18f60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18f70 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
18f80 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
18f90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
18fa0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
18fb0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
18fc0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
18fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
18fe0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
18ff0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
19000 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
19010 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
19020 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
19030 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
19040 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
19050 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
19060 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
19070 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
19080 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
19090 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
190a0 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
190b0 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
190c0 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
190d0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
190e0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
190f0 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
19100 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
19110 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
19120 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
19130 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
19140 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
19150 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
19160 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
19170 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
19180 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
19190 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
191a0 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
191b0 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
191c0 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
191d0 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
191e0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
191f0 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
19200 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
19210 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19220 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
19230 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
19240 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
19250 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
19260 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  ableSize;.  retu
19270 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn n;.}../*.** R
19280 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
19290 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
192a0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
192b0 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
192c0 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
192d0 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
192e0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
192f0 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
19300 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
19310 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
19320 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  nsions..**.** If
19330 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45   SQLITE_HAS_MUTE
19340 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  X is defined the
19350 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74  n the number ret
19360 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20  urned is the.** 
19370 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63  greater of the c
19380 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20  urrent reserved 
19390 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61  space and the ma
193a0 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a  ximum requested.
193b0 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65  ** reserve space
193c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
193d0 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52  BtreeGetOptimalR
193e0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
193f0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
19400 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19410 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
19420 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
19430 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65  oMutex(p);.#ifde
19440 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
19450 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42  EC.  if( n<p->pB
19460 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
19470 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  e ) n = p->pBt->
19480 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a  optimalReserve;.
19490 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
194a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
194b0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
194c0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
194d0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
194e0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
194f0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
19500 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
19510 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
19520 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
19530 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
19540 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
19550 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
19560 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
19570 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
19580 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19590 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
195a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
195b0 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
195c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
195d0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
195e0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
195f0 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
19600 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
19610 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19620 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
19630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
19640 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  e the values for
19650 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
19660 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f  DELETE and BTS_O
19670 56 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a 0a  VERWRITE flags:.
19680 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  **.**    newFlag
19690 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20 42  ==0       Both B
196a0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
196b0 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
196c0 54 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  TE are cleared.*
196d0 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20  *    newFlag==1 
196e0 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45        BTS_SECURE
196f0 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64 20  _DELETE set and 
19700 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73  BTS_OVERWRITE is
19710 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e   cleared.**    n
19720 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20 20  ewFlag==2       
19730 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
19740 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42 54  E cleared and BT
19750 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 73  S_OVERWRITE is s
19760 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  et.**    newFlag
19770 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68 61  ==(-1)    No cha
19780 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nges.**.** This 
19790 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
197a0 61 20 71 75 65 72 79 20 69 66 20 6e 65 77 46 6c  a query if newFl
197b0 61 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ag is less than 
197c0 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  zero.**.** With 
197d0 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73 65  BTS_OVERWRITE se
197e0 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  t, deleted conte
197f0 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  nt is overwritte
19800 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a  n by zeros, but.
19810 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  ** freelist leaf
19820 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 77   pages are not w
19830 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74  ritten back to t
19840 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
19850 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65  us in-page.** de
19860 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73  leted content is
19870 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66 72   cleared, but fr
19880 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20 63  eelist deleted c
19890 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a  ontent is not..*
198a0 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53 45  *.** With BTS_SE
198b0 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65  CURE_DELETE, ope
198c0 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42  ration is like B
198d0 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69 74  TS_OVERWRITE wit
198e0 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a  h the addition.*
198f0 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73 74 20  * that freelist 
19900 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20 77  leaf pages are w
19910 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
19920 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
19930 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65  ncreasing.** the
19940 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20   amount of disk 
19950 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  I/O..*/.int sqli
19960 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
19970 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
19980 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
19990 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
199a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
199b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
199c0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42  (p);.  assert( B
199d0 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42 54  TS_OVERWRITE==BT
199e0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a  S_SECURE_DELETE*
199f0 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42  2 );.  assert( B
19a00 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d 3d  TS_FAST_SECURE==
19a10 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c 42  (BTS_OVERWRITE|B
19a20 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
19a30 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  ) );.  if( newFl
19a40 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
19a50 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
19a60 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52   ~BTS_FAST_SECUR
19a70 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  E;.    p->pBt->b
19a80 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
19a90 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77  ECURE_DELETE*new
19aa0 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20  Flag;.  }.  b = 
19ab0 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  (p->pBt->btsFlag
19ac0 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43  s & BTS_FAST_SEC
19ad0 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45 5f  URE)/BTS_SECURE_
19ae0 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74 65  DELETE;.  sqlite
19af0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19b00 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f    return b;.}../
19b10 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
19b20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
19b30 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
19b40 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
19b50 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
19b60 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
19b70 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
19b80 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
19b90 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
19ba0 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
19bb0 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
19bc0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
19bd0 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
19be0 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
19bf0 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
19c00 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
19c10 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
19c20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19c30 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
19c40 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
19c50 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
19c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
19c70 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
19c80 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
19c90 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
19ca0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19cb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19cc0 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
19cd0 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
19ce0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
19cf0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
19d00 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
19d10 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
19d20 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f  XED)!=0 && (av ?
19d30 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
19d40 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
19d50 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
19d60 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
19d70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
19d80 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
19d90 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
19da0 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
19db0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19dc0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19dd0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
19de0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19df0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
19e00 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
19e10 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
19e20 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
19e30 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
19e40 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
19e50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19e60 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
19e70 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
19e80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
19e90 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
19ea0 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
19eb0 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
19ec0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
19ed0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19ee0 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
19ef0 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
19f00 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
19f10 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
19f20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
19f30 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
19f40 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
19f50 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
19f60 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
19f70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19f80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
19f90 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
19fa0 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
19fb0 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61 66   not set the saf
19fc0 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety-level for th
19fd0 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
19fe0 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20  ection.** using 
19ff0 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e  "PRAGMA synchron
1a000 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68 65  ous", and if the
1a010 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69 73   safety-level is
1a020 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
1a030 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
1a040 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1a050 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20  function as the 
1a060 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1a070 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a  ,.** set it so..
1a080 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  */.#if SQLITE_DE
1a090 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55  FAULT_SYNCHRONOU
1a0a0 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  S!=SQLITE_DEFAUL
1a0b0 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55  T_WAL_SYNCHRONOU
1a0c0 53 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66 69  S \.    && !defi
1a0d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1a0e0 57 41 4c 29 0a 73 74 61 74 69 63 20 76 6f 69 64  WAL).static void
1a0f0 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
1a100 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42  lag(BtShared *pB
1a110 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76  t, u8 safety_lev
1a120 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  el){.  sqlite3 *
1a130 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  db;.  Db *pDb;. 
1a140 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62   if( (db=pBt->db
1a150 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d  )!=0 && (pDb=db-
1a160 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  >aDb)!=0 ){.    
1a170 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d  while( pDb->pBt=
1a180 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e  =0 || pDb->pBt->
1a190 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b  pBt!=pBt ){ pDb+
1a1a0 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62  +; }.    if( pDb
1a1b0 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20  ->bSyncSet==0 . 
1a1c0 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65      && pDb->safe
1a1d0 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79  ty_level!=safety
1a1e0 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20  _level .     && 
1a1f0 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d  pDb!=&db->aDb[1]
1a200 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70   .    ){.      p
1a210 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1a220 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b   = safety_level;
1a230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1a240 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
1a250 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  >pPager,.       
1a260 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
1a270 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67  evel | (db->flag
1a280 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f  s & PAGER_FLAGS_
1a290 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  MASK));.    }.  
1a2a0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
1a2b0 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e  ne setDefaultSyn
1a2c0 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79  cFlag(pBt,safety
1a2d0 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a  _level).#endif..
1a2e0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
1a2f0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
1a300 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a310 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
1a320 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
1a330 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
1a340 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
1a350 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a360 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1a370 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
1a380 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
1a390 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
1a3a0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
1a3b0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
1a3c0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
1a3d0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1a3e0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
1a3f0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
1a400 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
1a410 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
1a420 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
1a430 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
1a440 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
1a450 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1a460 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1a470 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1a480 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
1a490 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
1a4a0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
1a4b0 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
1a4c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1a4d0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
1a4e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a4f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1a500 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1a510 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
1a520 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
1a530 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1a540 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1a550 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
1a560 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1a570 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1a580 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
1a590 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
1a5a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a5b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a5c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a5d0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
1a5e0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
1a5f0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
1a600 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
1a610 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a620 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1a630 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
1a640 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
1a650 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
1a660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a670 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1a680 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
1a690 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
1a6a0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
1a6b0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
1a6c0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
1a6d0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
1a6e0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
1a6f0 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
1a700 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
1a710 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
1a720 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1a730 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1a740 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
1a750 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
1a760 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
1a770 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
1a780 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1a790 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
1a7a0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
1a7b0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
1a7c0 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
1a7d0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
1a7e0 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
1a7f0 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
1a800 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
1a810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
1a820 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
1a830 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
1a840 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
1a850 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
1a860 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
1a870 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
1a880 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
1a890 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
1a8a0 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
1a8b0 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
1a8c0 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
1a8d0 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
1a8e0 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
1a8f0 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
1a900 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
1a910 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a920 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
1a930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1a940 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
1a950 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
1a960 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1a970 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
1a980 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
1a990 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
1a9a0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a9b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
1a9c0 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
1a9d0 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
1a9e0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1a9f0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
1aa00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1aa10 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
1aa20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1aa30 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1aa40 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1aa50 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
1aa60 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
1aa70 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
1aa80 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
1aa90 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
1aaa0 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
1aab0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1aac0 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
1aad0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
1aae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
1aaf0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1ab00 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
1ab10 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
1ab20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
1ab30 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
1ab40 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
1ab50 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
1ab60 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
1ab70 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
1ab80 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
1ab90 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1aba0 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
1abb0 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
1abc0 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
1abd0 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
1abe0 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
1abf0 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
1ac00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ac10 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
1ac20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1ac30 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
1ac40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
1ac50 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
1ac60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ac70 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
1ac80 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
1ac90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1aca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1acb0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1acc0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
1acd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1ace0 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
1acf0 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45  g(pBt, SQLITE_DE
1ad00 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
1ad10 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20  ONOUS+1);.      
1ad20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20    if( isOpen==0 
1ad30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1ad40 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1ad50 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e1);.          r
1ad60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ad70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ad80 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
1ad90 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
1ada0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65   }else{.      se
1adb0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
1adc0 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46  (pBt, SQLITE_DEF
1add0 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
1ade0 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +1);.    }.#endi
1adf0 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
1ae00 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
1ae10 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
1ae20 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
1ae30 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
1ae40 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
1ae50 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
1ae60 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
1ae70 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
1ae80 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
1ae90 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
1aea0 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
1aeb0 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
1aec0 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
1aed0 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
1aee0 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
1aef0 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
1af00 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
1af10 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
1af20 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
1af30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
1af40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1af50 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1af60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
1af70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
1af80 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
1af90 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
1afa0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
1afb0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
1afc0 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
1afd0 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
1afe0 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
1aff0 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
1b000 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
1b010 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
1b020 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
1b030 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
1b040 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
1b050 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
1b060 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1b070 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
1b080 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
1b090 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
1b0a0 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
1b0b0 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
1b0c0 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
1b0d0 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
1b0e0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
1b0f0 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
1b100 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
1b110 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
1b120 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
1b130 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
1b140 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1b150 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
1b160 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
1b170 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
1b180 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1b190 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
1b1a0 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
1b1b0 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
1b1c0 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
1b1d0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
1b1e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1b1f0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
1b200 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
1b210 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
1b220 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
1b230 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
1b240 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
1b250 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
1b260 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
1b270 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
1b280 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
1b290 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1b2a0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
1b2b0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
1b2c0 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
1b2d0 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
1b2e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b2f0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
1b300 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
1b310 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
1b320 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
1b330 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
1b340 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1b350 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
1b360 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
1b370 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1b380 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
1b390 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
1b3a0 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
1b3b0 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
1b3c0 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
1b3d0 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
1b3e0 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
1b3f0 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
1b400 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
1b410 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1b420 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
1b430 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
1b440 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
1b450 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
1b460 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
1b470 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
1b480 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
1b490 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
1b4a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1b4b0 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1b4c0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1b4d0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1b4e0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
1b4f0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1b500 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
1b510 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
1b520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b530 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1b540 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
1b550 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b580 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
1b590 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
1b5a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1b5b0 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
1b5c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
1b5d0 74 65 53 63 68 65 6d 61 29 3d 3d 30 20 26 26 20  teSchema)==0 && 
1b5e0 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20  nPage>nPageFile 
1b5f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1b600 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1b610 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
1b620 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1b630 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
1b640 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33  IDENCE-OF: R-283
1b650 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72  12-64704 However
1b660 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a  , the usable siz
1b670 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  e is not allowed
1b680 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65   to.    ** be le
1b690 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20  ss than 480. In 
1b6a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
1b6b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
1b6c0 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20   512, then the. 
1b6d0 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73     ** reserved s
1b6e0 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74  pace size cannot
1b6f0 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20   exceed 32. */. 
1b700 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
1b710 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
1b720 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1b730 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1b740 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
1b750 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
1b760 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
1b770 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
1b780 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b790 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1b7a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1b7b0 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
1b7c0 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
1b7d0 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
1b7e0 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
1b7f0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
1b800 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
1b810 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
1b820 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
1b830 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
1b840 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
1b850 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
1b860 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
1b870 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
1b880 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
1b890 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
1b8a0 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
1b8b0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
1b8c0 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
1b8d0 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
1b8e0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
1b8f0 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
1b900 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
1b910 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
1b920 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
1b930 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
1b940 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
1b950 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
1b960 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
1b970 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
1b980 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
1b990 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
1b9a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
1b9b0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
1b9c0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
1b9d0 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
1b9e0 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
1b9f0 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
1ba00 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
1ba10 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
1ba20 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
1ba30 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
1ba40 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
1ba50 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
1ba60 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
1ba70 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
1ba80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1ba90 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
1baa0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
1bab0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
1bac0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
1bad0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
1bae0 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
1baf0 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
1bb00 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
1bb10 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
1bb20 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
1bb30 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
1bb40 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  3);.  if( pBt->m
1bb50 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20  axLocal>127 ){. 
1bb60 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
1bb70 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20  Payload = 127;. 
1bb80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
1bb90 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
1bba0 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c   = (u8)pBt->maxL
1bbb0 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ocal;.  }.  asse
1bbc0 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
1bbd0 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
1bbe0 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
1bbf0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
1bc00 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61  age1;.  pBt->nPa
1bc10 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1bc20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bc30 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
1bc40 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
1bc50 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1bc60 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
1bc70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bc80 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1bc90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1bca0 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
1bcb0 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
1bcc0 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
1bcd0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
1bce0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
1bcf0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
1bd00 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
1bd10 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
1bd20 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
1bd30 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
1bd40 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
1bd50 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
1bd60 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
1bd70 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
1bd80 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
1bd90 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
1bda0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
1bdb0 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
1bdc0 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
1bdd0 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
1bde0 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
1bdf0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
1be00 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
1be10 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
1be20 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
1be30 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
1be40 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
1be50 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
1be60 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
1be70 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
1be80 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
1be90 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
1bea0 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
1beb0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
1bec0 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
1bed0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
1bee0 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
1bef0 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
1bf00 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
1bf10 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
1bf20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
1bf30 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
1bf40 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
1bf50 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
1bf60 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
1bf70 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
1bf80 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
1bf90 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
1bfa0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
1bfb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
1bfc0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
1bfd0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1bfe0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
1bff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
1c000 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
1c010 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1c020 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
1c030 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
1c040 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
1c050 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
1c060 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
1c070 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
1c080 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
1c090 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1c0a0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1c0b0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
1c0c0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
1c0d0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
1c0e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c0f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1c100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
1c110 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
1c120 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
1c130 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
1c140 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
1c150 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
1c160 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1c170 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
1c180 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
1c190 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1c1a0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
1c1b0 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
1c1c0 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
1c1d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
1c1e0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
1c1f0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
1c200 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
1c210 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
1c220 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a  ne(pPage1);.  }.
1c230 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
1c240 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
1c250 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
1c260 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
1c270 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
1c280 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
1c290 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
1c2a0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
1c2b0 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
1c2c0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1c2d0 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
1c2e0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1c2f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
1c300 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1c310 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
1c320 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c330 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1c340 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1c350 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
1c360 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1c380 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
1c390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
1c3a0 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
1c3b0 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
1c3c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1c3d0 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
1c3e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1c3f0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
1c400 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
1c410 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
1c420 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
1c430 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
1c440 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
1c450 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
1c460 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
1c470 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
1c480 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
1c490 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
1c4a0 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
1c4b0 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
1c4c0 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
1c4d0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
1c4e0 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
1c4f0 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
1c500 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
1c510 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
1c520 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
1c530 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
1c540 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
1c550 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
1c560 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
1c570 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
1c580 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
1c590 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
1c5a0 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
1c5b0 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
1c5c0 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
1c5d0 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
1c5e0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
1c5f0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
1c600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c610 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1c620 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
1c630 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
1c640 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
1c650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1c660 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
1c670 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
1c680 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
1c690 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1c6a0 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
1c6b0 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
1c6c0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
1c6d0 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
1c6e0 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
1c6f0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
1c700 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
1c710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c720 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
1c730 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
1c740 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1c750 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
1c760 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
1c770 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
1c780 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
1c790 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
1c7a0 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
1c7b0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
1c7c0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
1c7d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1c7e0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1c7f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c800 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
1c810 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1c820 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1c830 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
1c840 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
1c850 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
1c860 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
1c870 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1c880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c890 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
1c8a0 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
1c8b0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
1c8c0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1c8d0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
1c8e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1c8f0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
1c900 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
1c910 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1c920 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1c930 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
1c940 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
1c950 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1c960 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
1c970 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
1c980 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
1c990 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
1c9a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1c9b0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
1c9c0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
1c9d0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
1c9e0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
1c9f0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1ca00 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
1ca10 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
1ca20 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
1ca30 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
1ca40 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
1ca50 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
1ca60 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1ca70 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1ca80 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
1ca90 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
1caa0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
1cab0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
1cac0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
1cad0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
1cae0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1caf0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
1cb00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
1cb10 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
1cb20 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1cb30 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1cb40 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
1cb50 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1cb60 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
1cb70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
1cb80 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
1cb90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
1cba0 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
1cbb0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
1cbc0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1cbd0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
1cbe0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
1cbf0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
1cc00 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
1cc10 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
1cc20 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
1cc30 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
1cc40 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
1cc50 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
1cc60 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
1cc70 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
1cc80 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
1cc90 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
1cca0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
1ccb0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
1ccc0 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
1ccd0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
1cce0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
1ccf0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
1cd00 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
1cd10 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
1cd20 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
1cd30 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
1cd40 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
1cd50 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
1cd60 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
1cd70 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
1cd80 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
1cd90 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
1cda0 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
1cdb0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
1cdc0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
1cdd0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
1cde0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
1cdf0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
1ce00 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
1ce10 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
1ce20 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
1ce30 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
1ce40 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
1ce50 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
1ce60 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
1ce70 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
1ce80 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
1ce90 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
1cea0 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
1ceb0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
1cec0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
1ced0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
1cee0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
1cef0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
1cf00 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
1cf10 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
1cf20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1cf30 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
1cf40 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
1cf50 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  lag){.  BtShared
1cf60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1cf70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cf80 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 43 6f 6e  E_OK;.  int bCon
1cf90 63 75 72 72 65 6e 74 20 3d 20 28 70 2d 3e 64 62  current = (p->db
1cfa0 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26  ->bConcurrent &&
1cfb0 20 21 49 53 41 55 54 4f 56 41 43 55 55 4d 29 3b   !ISAUTOVACUUM);
1cfc0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1cfd0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1cfe0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1cff0 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1d000 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1d010 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1d020 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1d030 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1d040 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1d050 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1d060 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1d070 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1d080 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1d090 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1d0a0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1d0b0 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1d0c0 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1d0d0 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1d0e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1d0f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1d100 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1d110 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1d120 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1d130 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1d140 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1d150 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1d160 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1d170 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1d180 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1d190 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1d1a0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1d1b0 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1d1c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1d1d0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1d1e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1d1f0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1d200 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1d210 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1d220 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1d230 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1d240 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1d250 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1d260 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1d270 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1d280 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1d290 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1d2a0 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1d2b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1d2c0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1d2d0 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1d2e0 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1d2f0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1d300 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1d310 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d320 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1d330 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1d340 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1d350 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1d360 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1d370 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1d380 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1d390 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1d3a0 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1d3b0 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1d3c0 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1d3d0 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1d3e0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1d3f0 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1d400 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1d410 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1d420 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1d430 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1d440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d450 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1d460 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1d470 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1d480 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1d490 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d4a0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1d4b0 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1d4c0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1d4d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1d4e0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1d4f0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1d500 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1d510 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1d520 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1d530 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1d540 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1d550 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1d560 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1d570 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1d580 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d590 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1d5a0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1d5b0 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1d5c0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1d5d0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1d5e0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1d5f0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1d600 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1d610 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1d620 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1d630 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1d640 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1d650 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1d660 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1d670 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1d680 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1d690 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1d6a0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1d6b0 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1d6c0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1d6d0 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1d6e0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1d6f0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1d700 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1d710 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1d720 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1d730 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1d740 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1d750 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1d760 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1d770 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1d780 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1d790 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1d7a0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1d7b0 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1d7c0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1d7d0 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1d7e0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1d7f0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1d800 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1d810 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1d820 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1d830 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1d840 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1d850 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1d860 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1d870 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1d880 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1d890 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1d8a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d8b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1d8c0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1d8d0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  e{.        int e
1d8e0 78 46 6c 61 67 20 3d 20 62 43 6f 6e 63 75 72 72  xFlag = bConcurr
1d8f0 65 6e 74 20 3f 20 2d 31 20 3a 20 28 77 72 66 6c  ent ? -1 : (wrfl
1d900 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ag>1);.        r
1d910 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d920 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
1d930 72 2c 20 65 78 46 6c 61 67 2c 20 73 71 6c 69 74  r, exFlag, sqlit
1d940 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
1d950 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
1d960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d980 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1d990 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
1d9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d9b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d9c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d9d0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1d9e0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
1d9f0 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
1da00 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
1da10 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1da20 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
1da30 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
1da40 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
1da50 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
1da60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1da70 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1da80 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1da90 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
1daa0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1dab0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
1dac0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1dad0 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
1dae0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
1daf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1db00 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
1db10 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
1db20 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
1db30 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
1db40 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
1db50 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
1db60 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
1db70 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
1db80 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
1db90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1dba0 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
1dbb0 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
1dbc0 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
1dbd0 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
1dbe0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
1dbf0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1dc00 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1dc10 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
1dc20 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
1dc30 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
1dc40 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1dc50 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1dc60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1dc70 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1dc80 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
1dc90 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
1dca0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
1dcb0 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
1dcc0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1dcd0 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
1dce0 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
1dcf0 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
1dd00 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
1dd10 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
1dd20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
1dd30 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
1dd40 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
1dd50 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
1dd60 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
1dd70 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
1dd80 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
1dd90 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
1dda0 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
1ddb0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
1ddc0 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
1ddd0 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
1dde0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ddf0 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
1de00 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
1de10 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1de20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
1de30 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
1de40 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
1de50 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
1de60 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
1de70 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1de80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1de90 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
1dea0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1deb0 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
1dec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ded0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1dee0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1def0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1df00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1df10 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1df20 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1df30 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1df40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1df50 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
1df60 62 65 67 75 6e 3a 0a 23 69 66 6e 64 65 66 20 53  begun:.#ifndef S
1df70 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
1df80 52 52 45 4e 54 0a 20 20 69 66 28 20 62 43 6f 6e  RRENT.  if( bCon
1df90 63 75 72 72 65 6e 74 20 26 26 20 72 63 3d 3d 53  current && rc==S
1dfa0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
1dfb0 74 65 33 50 61 67 65 72 49 73 57 61 6c 28 70 42  te3PagerIsWal(pB
1dfc0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
1dfd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1dfe0 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72 72 65  gerBeginConcurre
1dff0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
1e000 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e010 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1e020 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
1e030 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61  treePtrmapAlloca
1e040 74 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  te(pBt);.    }. 
1e050 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
1e060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e070 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1e080 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
1e090 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
1e0a0 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
1e0b0 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
1e0c0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
1e0d0 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
1e0e0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1e0f0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1e100 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
1e110 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
1e120 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1e130 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
1e140 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
1e150 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
1e160 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 64  Savepoint = p->d
1e170 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20  b->nSavepoint;. 
1e180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e190 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1e1a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
1e1b0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1e1c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e1d0 4b 20 26 26 20 6e 53 61 76 65 70 6f 69 6e 74 20  K && nSavepoint 
1e1e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ){.      rc = bt
1e1f0 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70  reePtrmapBegin(p
1e200 42 74 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b  Bt, nSavepoint);
1e210 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74  .    }.  }..  bt
1e220 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1e230 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1e240 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1e250 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1e260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e270 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
1e280 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
1e290 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1e2a0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
1e2b0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
1e2c0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
1e2d0 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
1e2e0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1e2f0 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
1e300 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
1e310 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
1e320 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1e330 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
1e340 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
1e350 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
1e360 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e390 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
1e3a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e3d0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
1e3e0 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
1e3f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e420 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1e430 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1e440 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
1e450 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
1e460 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e470 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1e480 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1e490 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69  .  rc = pPage->i
1e4a0 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f  sInit ? SQLITE_O
1e4b0 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67  K : btreeInitPag
1e4c0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1e4d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e4e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65  return rc;.  nCe
1e4f0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1e500 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1e510 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1e520 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1e530 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1e540 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1e550 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1e560 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1e570 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1e580 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1e590 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1e5a0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1e5b0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1e5c0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1e5d0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1e5e0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1e5f0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1e600 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1e610 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1e620 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1e630 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1e640 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1e650 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1e660 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1e670 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1e680 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1e690 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1e6a0 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1e6b0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1e6c0 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1e6d0 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1e6e0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1e6f0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1e700 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1e710 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1e720 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1e730 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1e740 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1e750 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1e760 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1e770 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1e780 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1e790 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e7b0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1e7c0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1e7d0 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1e7e0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1e7f0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1e800 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1e810 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e820 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1e830 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1e840 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1e850 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1e860 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1e870 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1e880 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1e890 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1e8a0 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1e8b0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1e8c0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1e8d0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1e8e0 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1e8f0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1e900 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1e910 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1e920 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1e930 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e940 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1e950 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1e960 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1e970 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1e980 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1e990 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1e9a0 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1e9b0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1e9c0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1e9d0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1e9e0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1e9f0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1ea00 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1ea10 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1ea20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ea30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ea40 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
1ea50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  );.    }.    put
1ea60 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1ea70 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1ea80 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
1ea90 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1eaa0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1eab0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1eac0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1ead0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1eae0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1eaf0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1eb00 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1eb10 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1eb20 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1eb30 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1eb40 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1eb50 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1eb60 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1eb70 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
1eb80 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
1eb90 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
1eba0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
1ebb0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1ebc0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
1ebd0 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
1ebe0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  fo.nPayload ){. 
1ebf0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1ec00 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20  ll+info.nSize > 
1ec10 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1ec20 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
1ec30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1ec40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ec50 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
1ec60 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
1ec70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ec80 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
1ec90 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1eca0 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20  .nSize-4) ){.   
1ecb0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1ecc0 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1ecd0 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20  ze-4, iTo);.    
1ece0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ecf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ed00 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1ed10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1ed20 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1ed30 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1ed40 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1ed50 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1ed60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1ed70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ed80 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1ed90 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1eda0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1edb0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1edc0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1edd0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1ede0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1edf0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1ee00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ee10 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
1ee20 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
1ee30 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1ee40 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1ee50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1ee60 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
1ee70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ee80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1ee90 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
1eea0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1eeb0 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
1eec0 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
1eed0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1eee0 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
1eef0 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
1ef00 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
1ef10 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
1ef20 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1ef30 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
1ef40 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
1ef50 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
1ef60 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
1ef70 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
1ef80 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1ef90 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
1efa0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
1efb0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1efc0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
1efd0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1efe0 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
1eff0 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
1f000 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
1f010 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1f020 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
1f030 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
1f040 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
1f050 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
1f060 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f080 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
1f090 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
1f0a0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1f0b0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
1f0c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1f0d0 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
1f0e0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1f0f0 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
1f100 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
1f110 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
1f120 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
1f130 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f150 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
1f160 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
1f170 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
1f180 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1f190 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
1f1a0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1f1b0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1f1c0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1f1d0 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
1f1e0 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
1f1f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1f200 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
1f210 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1f220 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1f230 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
1f240 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1f250 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
1f260 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1f270 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1f280 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
1f290 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f2a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1f2b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1f2c0 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
1f2d0 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
1f2e0 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
1f2f0 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
1f300 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
1f310 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
1f320 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
1f330 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
1f340 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
1f350 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
1f360 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
1f370 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
1f380 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
1f390 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
1f3a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f3b0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
1f3c0 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
1f3d0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1f3e0 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
1f3f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f400 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1f410 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
1f420 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
1f430 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
1f440 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
1f450 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
1f460 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
1f470 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
1f480 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
1f490 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1f4a0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
1f4b0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1f4c0 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
1f4d0 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
1f4e0 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
1f4f0 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
1f500 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
1f510 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
1f520 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
1f530 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
1f540 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
1f550 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
1f560 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1f570 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
1f580 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
1f590 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
1f5a0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
1f5b0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1f5c0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1f5d0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1f5e0 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1f5f0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1f600 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
1f610 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
1f620 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1f630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f640 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f650 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1f660 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
1f670 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
1f680 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
1f690 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
1f6a0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1f6b0 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
1f6c0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1f6d0 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
1f6e0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
1f6f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f700 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f720 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
1f730 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
1f740 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
1f750 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
1f760 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
1f770 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
1f780 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
1f790 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
1f7a0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
1f7b0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
1f7c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1f7d0 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
1f7e0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1f7f0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1f800 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
1f810 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
1f820 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f830 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1f840 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1f850 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f860 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
1f870 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1f880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f890 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
1f8a0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1f8b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f8c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1f8d0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1f8e0 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
1f8f0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1f900 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
1f910 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1f920 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1f930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f940 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1f950 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1f960 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
1f970 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
1f980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f990 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1f9a0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1f9b0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1f9c0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
1f9d0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1f9e0 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
1f9f0 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
1fa00 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
1fa10 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
1fa20 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
1fa30 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1fa40 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
1fa50 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
1fa60 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
1fa70 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
1fa80 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
1fa90 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
1faa0 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
1fab0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
1fac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1fad0 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
1fae0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1faf0 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
1fb00 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
1fb10 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
1fb20 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
1fb30 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
1fb40 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
1fb50 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
1fb60 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
1fb70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
1fb80 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1fb90 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
1fba0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
1fbb0 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
1fbc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1fbd0 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
1fbe0 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
1fbf0 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
1fc00 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
1fc10 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1fc20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
1fc30 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
1fc40 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
1fc50 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
1fc60 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
1fc70 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
1fc80 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
1fc90 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
1fca0 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
1fcb0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1fcc0 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
1fcd0 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
1fce0 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
1fcf0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
1fd00 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
1fd10 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
1fd20 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
1fd30 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
1fd40 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
1fd50 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
1fd60 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
1fd70 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
1fd80 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1fd90 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
1fda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fdb0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
1fdc0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
1fdd0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
1fde0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1fdf0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1fe00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1fe10 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
1fe20 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
1fe30 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
1fe40 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
1fe50 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
1fe60 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1fe70 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
1fe80 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
1fe90 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
1fea0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
1feb0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fec0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
1fed0 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
1fee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fef0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1ff00 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1ff10 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
1ff20 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
1ff30 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1ff40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ff50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ff60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
1ff70 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1ff80 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
1ff90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1ffa0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1ffb0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1ffc0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1ffd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
1ffe0 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1fff0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
20000 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
20010 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
20020 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
20030 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
20040 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
20050 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
20060 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
20070 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
20080 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
20090 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
200a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
200b0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
200c0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
200d0 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
200e0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
200f0 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
20100 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20110 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
20120 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
20130 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
20140 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
20150 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
20160 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
20170 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
20180 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
20190 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
201a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
201b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
201c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
201d0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
201e0 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
201f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20200 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
20210 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
20220 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
20230 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
20240 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
20250 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
20260 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
20270 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
20280 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
20290 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
202a0 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
202b0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
202c0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
202d0 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
202e0 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
202f0 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
20300 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
20310 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
20320 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
20330 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
20340 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
20350 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20370 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20380 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
20390 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
203a0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
203b0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
203c0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
203d0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
203e0 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
203f0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
20400 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
20410 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
20420 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20430 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
20440 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
20450 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
20460 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
20470 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
20480 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
20490 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
204a0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
204b0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
204c0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
204d0 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
204e0 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
204f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
20500 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
20510 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
20520 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
20530 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
20540 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
20550 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
20560 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
20570 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
20580 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
20590 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
205a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
205b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
205c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
205d0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
205e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
205f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
20600 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
20610 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
20620 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
20630 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
20640 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
20650 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
20660 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
20670 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
20680 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
20690 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
206a0 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
206b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
206c0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
206d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
206e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
206f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
20700 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
20710 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
20720 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
20730 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
20740 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
20750 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20760 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
20770 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
20780 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
20790 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
207a0 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
207b0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
207c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
207d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
207e0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
207f0 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
20800 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
20810 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
20820 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
20830 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
20840 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
20850 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
20860 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
20870 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20880 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
20890 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
208a0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
208b0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
208c0 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
208d0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
208e0 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
208f0 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
20900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20910 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20920 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
20930 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
20940 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20960 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20970 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
20980 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
20990 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
209b0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
209c0 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
209d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
209e0 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
209f0 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
20a00 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
20a10 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
20a20 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
20a30 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
20a40 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
20a50 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
20a60 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
20a70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20a80 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
20a90 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
20aa0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
20ab0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
20ac0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
20ad0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
20ae0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
20af0 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
20b00 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
20b10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
20b20 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
20b30 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
20b40 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
20b50 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
20b60 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
20b70 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
20b80 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
20b90 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
20ba0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
20bb0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
20bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
20bd0 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
20be0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
20bf0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
20c00 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
20c10 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
20c20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
20c30 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
20c40 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
20c50 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
20c60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
20c70 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
20c80 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
20c90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20ca0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
20cb0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
20cc0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
20cd0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
20ce0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
20cf0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
20d00 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
20d10 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
20d20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
20d30 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
20d40 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
20d50 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
20d60 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
20d70 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
20d80 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20d90 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
20da0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
20db0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
20dc0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
20dd0 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
20de0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20df0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20e00 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
20e10 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
20e20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
20e30 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
20e40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20e60 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
20e70 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
20e80 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
20e90 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
20ea0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
20eb0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
20ec0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20ee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20ef0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
20f00 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
20f10 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20f20 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20f30 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
20f40 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
20f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
20f70 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
20f80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
20f90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
20fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20fb0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
20fc0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
20fd0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
20fe0 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
20ff0 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
21000 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
21010 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
21020 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
21030 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
21040 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
21050 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
21060 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
21070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
21080 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
21090 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
210a0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
210b0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
210c0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
210d0 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
210e0 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
210f0 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
21100 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
21110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
21120 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
21130 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
21140 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21150 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
21160 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
21170 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
21180 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
21190 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
211a0 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61  (pPager); )..  a
211b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
211c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
211d0 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
211e0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
211f0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
21200 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
21210 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
21220 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
21230 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
21240 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21250 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
21260 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
21270 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
21280 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
21290 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
212a0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
212b0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
212c0 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
212d0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
212e0 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
212f0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
21300 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
21310 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
21320 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
21330 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
21340 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
21350 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
21360 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
21370 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
21380 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
21390 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
213a0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
213b0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
213c0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
213d0 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
213e0 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
213f0 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
21400 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
21410 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
21420 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
21430 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
21440 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
21450 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
21460 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
21470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21480 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21490 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
214a0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
214b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
214c0 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
214d0 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
214e0 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
214f0 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
21500 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
21510 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21520 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
21530 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
21540 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
21550 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
21560 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
21570 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
21580 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
21590 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
215a0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
215b0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
215c0 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
215d0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
215e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
215f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
21600 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
21610 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21620 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
21630 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
21640 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
21650 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
21660 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
21670 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
21680 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
21690 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
216a0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
216b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
216c0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
216d0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
216e0 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
216f0 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
21700 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
21710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21720 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
21730 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
21740 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
21750 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
21760 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
21770 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
21780 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
21790 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
217a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
217b0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
217c0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
217d0 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
217e0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
217f0 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
21800 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  T./*.** This fun
21810 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
21820 61 73 20 70 61 72 74 20 6f 66 20 6d 65 72 67 69  as part of mergi
21830 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54  ng an CONCURRENT
21840 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74   transaction wit
21850 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73 68 6f  h.** the snapsho
21860 74 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66  t at the head of
21870 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e 20 49   the wal file. I
21880 74 20 72 65 6c 6f 63 61 74 65 73 20 61 6c 6c 20  t relocates all 
21890 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pages in the.** 
218a0 72 61 6e 67 65 20 69 46 69 72 73 74 2e 2e 69 4c  range iFirst..iL
218b0 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
218c0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
218d0 61 74 20 74 68 65 20 42 74 72 65 65 50 74 72 6d  at the BtreePtrm
218e0 61 70 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ap .** structure
218f0 20 61 74 20 42 74 53 68 61 72 65 64 2e 70 4d 61   at BtShared.pMa
21900 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  p contains the l
21910 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ocation of the p
21920 6f 69 6e 74 65 72 73 20 74 6f 20 65 61 63 68 0a  ointers to each.
21930 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 72  ** page in the r
21940 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ange..**.** If p
21950 6e 43 75 72 72 65 6e 74 20 69 73 20 4e 55 4c 4c  nCurrent is NULL
21960 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
21970 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 61 72   in the range ar
21980 65 20 6d 6f 76 65 64 20 74 6f 20 63 75 72 72 65  e moved to curre
21990 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c 6f 63  ntly.** free loc
219a0 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66 72 65  ations (i.e. fre
219b0 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 29 20  e-list entries) 
219c0 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62  within the datab
219d0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
219e0 70 61 67 65 0a 2a 2a 20 69 46 69 72 73 74 2e 0a  page.** iFirst..
219f0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70 6e 43  **.** Or, if pnC
21a00 75 72 72 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  urrent is not NU
21a10 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f 69 6e  LL, then it poin
21a20 74 73 20 74 6f 20 61 20 76 61 6c 75 65 20 63 6f  ts to a value co
21a30 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ntaining the.** 
21a40 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
21a50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21a60 65 20 69 6e 20 70 61 67 65 73 2e 20 49 6e 20 74  e in pages. In t
21a70 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20 70 61  his case, all pa
21a80 67 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c 6f 63  ges are.** reloc
21a90 61 74 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20  ated to the end 
21aa0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21ab0 66 69 6c 65 20 2d 20 70 61 67 65 20 69 46 69 72  file - page iFir
21ac0 73 74 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  st is relocated 
21ad0 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70 6e 43  to.** page (*pnC
21ae0 75 72 72 65 6e 74 2b 31 29 2c 20 70 61 67 65 20  urrent+1), page 
21af0 69 46 69 72 73 74 2b 31 20 74 6f 20 70 61 67 65  iFirst+1 to page
21b00 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32 29 2c   (*pnCurrent+2),
21b10 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 56   and so on..** V
21b20 61 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e 74 20  alue *pnCurrent 
21b30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 65  is set to the ne
21b40 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  w size of the da
21b50 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
21b60 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
21b70 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
21b80 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
21b90 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
21ba0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
21bb0 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
21bc0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
21bd0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
21be0 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a 20 20 42  locateRange(.  B
21bf0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c10 2a 20 42 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  * B-tree handle 
21c20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72 73 74  */.  Pgno iFirst
21c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21c40 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
21c50 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a  ge to relocate *
21c60 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 2c 20  /.  Pgno iLast, 
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c80 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65      /* Last page
21c90 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f 0a   to relocate */.
21ca0 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72 65 6e    Pgno *pnCurren
21cb0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
21cc0 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
21cd0 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61 62 61  , IN/OUT: Databa
21ce0 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  se size */.){.  
21cf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21d00 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  OK;.  BtreePtrma
21d10 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
21d20 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50 67 3b  Map;.  Pgno iPg;
21d30 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69 46 69 72  ..  for(iPg=iFir
21d40 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74 20 26  st; iPg<=iLast &
21d50 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
21d60 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d   iPg++){.    Mem
21d70 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20 30 3b  Page *pFree = 0;
21d80 20 20 20 20 20 2f 2a 20 50 61 67 65 20 61 6c 6c       /* Page all
21d90 6f 63 61 74 65 64 20 66 72 6f 6d 20 66 72 65 65  ocated from free
21da0 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d 65 6d  -list */.    Mem
21db0 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
21dc0 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20 20 20     Pgno iNew;   
21dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
21de0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  w page number fo
21df0 72 20 70 50 67 20 2a 2f 0a 20 20 20 20 50 74 72  r pPg */.    Ptr
21e00 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72 79  mapEntry *pEntry
21e10 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
21e20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
21e30 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20 20 69  ge iPg */..    i
21e40 66 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  f( iPg==PENDING_
21e50 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
21e60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
21e70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61  Entry = &pMap->a
21e80 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70 2d 3e  Ptr[iPg - pMap->
21e90 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20 69 66  iFirst];..    if
21ea0 28 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d  ( pEntry->eType=
21eb0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
21ec0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 64   ){.      Pgno d
21ed0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63 20 3d  ummy;.      rc =
21ee0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
21ef0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c 20  ge(pBt, &pFree, 
21f00 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42 54 41  &dummy, iPg, BTA
21f10 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
21f20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
21f30 46 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Free);.      ass
21f40 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21f50 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67  OK || dummy==iPg
21f60 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
21f70 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20  ( pnCurrent ){. 
21f80 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61 67       btreeGetPag
21f90 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67  e(pBt, iPg, &pPg
21fa0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
21fb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
21fc0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 67 2d  Iswriteable(pPg-
21fd0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
21fe0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
21ff0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
22000 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61 67 65  unt(pPg->pDbPage
22010 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 4e  )==1 );.      iN
22020 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
22030 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  nt);.      if( i
22040 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  New==PENDING_BYT
22050 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 69 4e  E_PAGE(pBt) ) iN
22060 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
22070 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
22080 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
22090 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65  , pPg, pEntry->e
220a0 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61  Type, pEntry->pa
220b0 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a  rent, iNew, 1);.
220c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
220d0 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  eNotNull(pPg);. 
220e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
220f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
22100 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
22110 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69 72 73  ee, &iNew, iFirs
22120 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29  t-1, BTALLOC_LE)
22130 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
22150 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29 3b 0a   iNew<iFirst );.
22160 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22180 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22190 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Free);.        b
221a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
221b0 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a   iPg, &pPg, 0);.
221c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
221d0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
221e0 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  Pg, pEntry->eTyp
221f0 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e  e, pEntry->paren
22200 74 2c 69 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20  t,iNew,1);.     
22210 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22220 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
22230 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22240 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e  rc;.}../* !defin
22250 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
22260 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
22270 20 54 68 65 20 62 2d 74 72 65 65 20 68 61 6e 64   The b-tree hand
22280 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
22290 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69   only argument i
222a0 73 20 61 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69  s about to commi
222b0 74 20 61 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45  t an.** CONCURRE
222c0 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  NT transaction. 
222d0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
222e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
222f0 68 61 74 20 74 68 69 73 20 69 73 20 0a 2a 2a 20  hat this is .** 
22300 70 6f 73 73 69 62 6c 65 20 2d 20 74 68 65 20 77  possible - the w
22310 61 6c 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 69  al WRITER lock i
22320 73 20 68 65 6c 64 20 61 6e 64 20 69 74 20 69 73  s held and it is
22330 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 72   known that ther
22340 65 20 61 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e  e are .** no con
22350 66 6c 69 63 74 73 20 77 69 74 68 20 63 6f 6d 6d  flicts with comm
22360 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
22370 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
22380 74 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b  t btreeFixUnlock
22390 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
223a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
223b0 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
223c0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
223d0 3e 70 50 61 67 65 31 3b 0a 20 20 75 38 20 2a 70  >pPage1;.  u8 *p
223e0 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
223f0 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
22400 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
22410 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22420 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
22430 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
22440 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 77  atabase is not w
22450 72 69 74 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f  ritable, then no
22460 20 70 61 67 65 73 20 77 65 72 65 20 61 6c 6c 6f   pages were allo
22470 63 61 74 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72  cated.  ** or fr
22480 65 65 64 20 62 79 20 74 68 69 73 20 74 72 61 6e  eed by this tran
22490 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
224a0 20 63 61 73 65 20 6e 6f 20 73 70 65 63 69 61 6c   case no special
224b0 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20   handling is .  
224c0 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  ** required. Oth
224d0 65 72 77 69 73 65 2c 20 69 66 20 70 61 67 65 20  erwise, if page 
224e0 31 20 69 73 20 64 69 72 74 79 2c 20 70 72 6f 63  1 is dirty, proc
224f0 65 65 64 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65  eed.  */.  Btree
22500 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
22510 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f  Bt->pMap;.  Pgno
22520 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
22530 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50  te(&p1[32]);.  P
22540 67 6e 6f 20 6e 50 61 67 65 20 3d 20 62 74 72 65  gno nPage = btre
22550 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
22560 0a 20 20 75 33 32 20 6e 46 72 65 65 20 3d 20 67  .  u32 nFree = g
22570 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29  et4byte(&p1[36])
22580 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
22590 2d 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d  ->pMap );.  rc =
225a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 70 67   sqlite3PagerUpg
225b0 72 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50 61  radeSnapshot(pPa
225c0 67 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44 62  ger, pPage1->pDb
225d0 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
225e0 20 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61   p1==pPage1->aDa
225f0 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ta );..  if( rc=
22600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22610 20 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20    Pgno nHPage = 
22620 67 65 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d  get4byte(&p1[28]
22630 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
22640 20 3d 20 6e 48 50 61 67 65 3b 20 20 20 20 20 20   = nHPage;      
22650 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
22660 20 61 66 74 65 72 20 74 72 61 6e 73 61 63 74 69   after transacti
22670 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20  on merge */..   
22680 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
22690 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
226a0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 7b  ge1->pDbPage) ){
226b0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 48 54 72  .      Pgno iHTr
226c0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
226d0 70 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 75  p1[32]);.      u
226e0 33 32 20 6e 48 46 72 65 65 20 3d 20 67 65 74 34  32 nHFree = get4
226f0 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a  byte(&p1[36]);..
22700 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
22710 74 68 65 20 68 65 61 64 20 64 61 74 61 62 61 73  the head databas
22720 65 20 66 72 65 65 20 6c 69 73 74 20 74 6f 20 74  e free list to t
22730 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 75  he end of the cu
22740 72 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  rrent.      ** t
22750 72 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 65 65  ransactions free
22760 2d 6c 69 73 74 20 28 69 66 20 61 6e 79 29 2e 20  -list (if any). 
22770 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 54   */.      if( iT
22780 72 75 6e 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  runk!=0 ){.     
22790 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b     put4byte(&p1[
227a0 33 36 5d 2c 20 6e 48 46 72 65 65 20 2b 20 6e 46  36], nHFree + nF
227b0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ree);.        pu
227c0 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d 2c 20  t4byte(&p1[32], 
227d0 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
227e0 20 77 68 69 6c 65 28 20 69 54 72 75 6e 6b 20 29   while( iTrunk )
227f0 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
22800 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 73 71 6c  ge *pTrunk = sql
22810 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
22820 70 50 61 67 65 72 2c 20 69 54 72 75 6e 6b 29 3b  pPager, iTrunk);
22830 0a 20 20 20 20 20 20 20 20 20 20 69 54 72 75 6e  .          iTrun
22840 6b 20 3d 20 67 65 74 34 62 79 74 65 28 28 75 38  k = get4byte((u8
22850 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61 29  *)pTrunk->pData)
22860 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22870 69 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20  iTrunk==0 ){.   
22880 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
22890 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70  e((u8*)pTrunk->p
228a0 44 61 74 61 2c 20 69 48 54 72 75 6e 6b 29 3b 0a  Data, iHTrunk);.
228b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
228c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
228d0 65 72 55 6e 72 65 66 28 70 54 72 75 6e 6b 29 3b  erUnref(pTrunk);
228e0 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
228f0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e    }..      if( n
22900 48 50 61 67 65 3c 28 70 4d 61 70 2d 3e 69 46 69  HPage<(pMap->iFi
22910 72 73 74 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  rst-1) ){.      
22920 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22930 65 20 63 6f 6e 73 69 73 74 65 64 20 6f 66 20 28  e consisted of (
22940 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20  pMap->iFirst-1) 
22950 70 61 67 65 73 20 77 68 65 6e 20 74 68 65 20 63  pages when the c
22960 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  urrent.        *
22970 2a 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61  * concurrent tra
22980 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
22990 6e 65 64 2e 20 41 6e 64 20 61 6e 20 63 6f 6e 63  ned. And an conc
229a0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
229b0 6f 6e 20 6d 61 79 0a 20 20 20 20 20 20 20 20 2a  on may.        *
229c0 2a 20 6e 6f 74 20 62 65 20 65 78 65 63 75 74 65  * not be execute
229d0 64 20 6f 6e 20 61 6e 20 61 75 74 6f 2d 76 61 63  d on an auto-vac
229e0 75 75 6d 20 64 61 74 61 62 61 73 65 20 2d 20 73  uum database - s
229f0 6f 20 74 68 65 20 64 62 20 73 68 6f 75 6c 64 20  o the db should 
22a00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
22a10 68 61 76 65 20 73 68 72 75 6e 6b 20 73 69 6e 63  have shrunk sinc
22a20 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
22a30 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 54 68  n was opened. Th
22a40 65 72 65 66 6f 72 65 20 6e 48 50 61 67 65 0a 20  erefore nHPage. 
22a50 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64         ** should
22a60 20 62 65 20 73 65 74 20 74 6f 20 28 70 4d 61 70   be set to (pMap
22a70 2d 3e 69 46 69 72 73 74 2d 31 29 20 6f 72 20 67  ->iFirst-1) or g
22a80 72 65 61 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  reater. */.     
22a90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
22aa0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
22ab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22ac0 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
22ad0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c   transaction all
22ae0 6f 63 61 74 65 64 20 70 61 67 65 73 20 70 4d 61  ocated pages pMa
22af0 70 2d 3e 69 46 69 72 73 74 20 74 68 72 6f 75 67  p->iFirst throug
22b00 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 50 61  h.        ** nPa
22b10 67 65 20 28 69 6e 63 6c 75 73 69 76 65 29 20 61  ge (inclusive) a
22b20 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
22b30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22b40 4d 65 61 6e 77 68 69 6c 65 2c 0a 20 20 20 20 20  Meanwhile,.     
22b50 20 20 20 2a 2a 20 6f 74 68 65 72 20 74 72 61 6e     ** other tran
22b60 73 61 63 74 69 6f 6e 73 20 68 61 76 65 20 61 6c  sactions have al
22b70 6c 6f 63 61 74 65 64 20 28 69 46 69 72 73 74 2e  located (iFirst.
22b80 2e 6e 48 50 61 67 65 29 2e 20 53 6f 20 6d 6f 76  .nHPage). So mov
22b90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
22ba0 65 73 20 28 69 46 69 72 73 74 2e 2e 4d 49 4e 28  es (iFirst..MIN(
22bb0 6e 50 61 67 65 2c 6e 48 50 61 67 65 29 29 20 74  nPage,nHPage)) t
22bc0 6f 20 28 4d 41 58 28 6e 50 61 67 65 2c 6e 48 50  o (MAX(nPage,nHP
22bd0 61 67 65 29 2b 31 29 2e 20 2a 2f 0a 20 20 20 20  age)+1). */.    
22be0 20 20 20 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d      Pgno iLast =
22bf0 20 4d 49 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61   MIN(nPage, nHPa
22c00 67 65 29 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20  ge);    /* Last 
22c10 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
22c20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 43 75          Pgno nCu
22c30 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rrent;          
22c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
22c50 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 64  urrent size of d
22c60 62 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 6e 43  b */..        nC
22c70 75 72 72 65 6e 74 20 3d 20 4d 41 58 28 6e 50 61  urrent = MAX(nPa
22c80 67 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20 20 20  ge, nHPage);.   
22c90 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
22ca0 3d 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  = nCurrent;.    
22cb0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65      rc = btreeRe
22cc0 6c 6f 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c  locateRange(pBt,
22cd0 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 2c 20 69   pMap->iFirst, i
22ce0 4c 61 73 74 2c 20 26 6e 43 75 72 72 65 6e 74 29  Last, &nCurrent)
22cf0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
22d00 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 63  ere are now no c
22d10 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74  ollisions with t
22d20 68 65 20 73 6e 61 70 73 68 6f 74 20 61 74 20 74  he snapshot at t
22d30 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 0a 20  he head of the. 
22d40 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
22d50 73 65 20 66 69 6c 65 2e 20 53 6f 20 61 74 20 74  se file. So at t
22d60 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75  his point it wou
22d70 6c 64 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ld be possible t
22d80 6f 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20  o write.        
22d90 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
22da0 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20  on out to disk. 
22db0 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 20  Before doing so 
22dc0 74 68 6f 75 67 68 2c 20 61 74 74 65 6d 70 74 20  though, attempt 
22dd0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  to.        ** re
22de0 6c 6f 63 61 74 65 20 73 6f 6d 65 20 6f 66 20 74  locate some of t
22df0 68 65 20 6e 65 77 20 70 61 67 65 73 20 74 6f 20  he new pages to 
22e00 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77  free locations w
22e10 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 0a 20  ithin the body. 
22e20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
22e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
22e40 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74 20 65  i.e. free-list e
22e50 6e 74 72 69 65 73 29 2e 20 2a 2f 0a 20 20 20 20  ntries). */.    
22e60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22e70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22e80 20 20 20 61 73 73 65 72 74 28 20 6e 43 75 72 72     assert( nCurr
22e90 65 6e 74 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ent!=PENDING_BYT
22ea0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
22eb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22ec0 50 61 67 65 72 53 65 74 44 62 73 69 7a 65 28 70  PagerSetDbsize(p
22ed0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 43 75 72  Bt->pPager, nCur
22ee0 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rent);.         
22ef0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
22f00 65 28 26 70 31 5b 33 36 5d 29 3b 0a 20 20 20 20  e(&p1[36]);.    
22f10 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 43 75        nFin = nCu
22f20 72 72 65 6e 74 2d 6e 46 72 65 65 3b 0a 20 20 20  rrent-nFree;.   
22f30 20 20 20 20 20 20 20 69 66 28 20 6e 43 75 72 72         if( nCurr
22f40 65 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  ent>PENDING_BYTE
22f50 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
22f60 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in<=PENDING_BYTE
22f70 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
22f80 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d            nFin--
22f90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22fa0 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 4d          nFin = M
22fb0 41 58 28 6e 46 69 6e 2c 20 6e 48 50 61 67 65 29  AX(nFin, nHPage)
22fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
22fd0 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61   btreeRelocateRa
22fe0 6e 67 65 28 70 42 74 2c 20 6e 46 69 6e 2b 31 2c  nge(pBt, nFin+1,
22ff0 20 6e 43 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20   nCurrent, 0);. 
23000 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
23010 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 32    put4byte(&p1[2
23020 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
23030 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
23040 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73 69  ite3PagerSetDbsi
23050 7a 65 28 70 50 61 67 65 72 2c 20 6e 46 69 6e 29  ze(pPager, nFin)
23060 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
23070 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
23080 66 69 6e 65 20 62 74 72 65 65 46 69 78 55 6e 6c  fine btreeFixUnl
23090 6f 63 6b 65 64 28 58 29 20 20 53 51 4c 49 54 45  ocked(X)  SQLITE
230a0 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  _OK.#endif /* SQ
230b0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
230c0 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  RENT */../*.** T
230d0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
230e0 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
230f0 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
23100 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
23110 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
23120 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
23130 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
23140 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
23150 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
23160 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
23170 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
23180 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
23190 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
231a0 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
231b0 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
231c0 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
231d0 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
231e0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
231f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
23200 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
23210 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
23220 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
23230 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
23240 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
23250 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
23260 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
23270 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
23280 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
23290 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
232a0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
232b0 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
232c0 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
232d0 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
232e0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
232f0 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
23300 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
23310 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
23320 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
23330 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
23340 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
23350 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
23360 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
23370 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74  PhaseTwo() for t
23380 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
23390 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
233a0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
233b0 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
233c0 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
233d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
233e0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
233f0 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
23400 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
23410 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23420 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
23430 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
23440 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
23450 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
23460 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
23470 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
23480 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
23490 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
234a0 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
234b0 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
234c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
234d0 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
234e0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
234f0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
23500 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
23510 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
23520 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
23530 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
23540 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
23550 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
23560 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
23570 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
23580 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
23590 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
235a0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
235b0 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
235c0 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
235d0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
235e0 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
235f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23600 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
23610 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
23620 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
23630 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
23640 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
23650 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
23660 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23670 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
23680 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
23690 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
236a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
236b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
236c0 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20  er(p);..#ifndef 
236d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
236e0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
236f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
23700 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23710 49 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20  ISCONCURRENT==0 
23720 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  );.      rc = au
23730 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
23740 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
23750 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
23770 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
23780 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
237a0 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
237b0 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
237c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
237d0 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
237e0 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
237f0 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
23800 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  f.    if( rc==SQ
23810 4c 49 54 45 5f 4f 4b 20 26 26 20 49 53 43 4f 4e  LITE_OK && ISCON
23820 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 20  CURRENT ){.     
23830 20 72 63 20 3d 20 62 74 72 65 65 46 69 78 55 6e   rc = btreeFixUn
23840 6c 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20 20 7d  locked(p);.    }
23850 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23870 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23880 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
23890 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
238a0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ster, 0);.    }.
238b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
238c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
238d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
238e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
238f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
23900 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
23910 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
23920 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
23930 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
23940 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
23950 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
23960 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
23970 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
23980 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
23990 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
239a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
239b0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
239c0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
239d0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
239e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
239f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
23a00 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
23a10 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
23a20 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
23a30 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
23a40 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
23a50 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
23a60 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
23a70 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
23a80 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
23a90 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
23aa0 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
23ab0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
23ac0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
23ad0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
23ae0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
23af0 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
23b00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
23b10 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
23b20 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
23b30 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
23b40 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
23b50 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
23b60 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
23b70 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
23b80 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
23b90 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
23ba0 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
23bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
23bc0 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
23bd0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
23be0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
23bf0 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
23c00 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
23c10 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
23c20 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
23c30 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
23c40 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
23c50 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
23c60 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
23c70 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
23c80 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
23c90 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
23ca0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
23cb0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
23cc0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
23cd0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
23ce0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
23cf0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
23d00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
23d10 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
23d20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23d30 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
23d40 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
23d50 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
23d60 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
23d70 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
23d80 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
23d90 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
23da0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
23db0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
23dc0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
23dd0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
23de0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
23df0 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
23e00 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
23e10 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  n CONCURRENT tra
23e20 6e 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65 74 65  nsaction, delete
23e30 20 74 68 65 20 70 42 74 2d 3e 70 4d 61 70 20 6f   the pBt->pMap o
23e40 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 41 6c 73 6f  bject..  ** Also
23e50 20 63 61 6c 6c 20 50 61 67 65 72 45 6e 64 43 6f   call PagerEndCo
23e60 6e 63 75 72 72 65 6e 74 28 29 20 74 6f 20 65 6e  ncurrent() to en
23e70 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
23e80 67 65 72 20 68 61 73 20 64 69 73 63 61 72 64 65  ger has discarde
23e90 64 0a 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72  d.  ** the recor
23ea0 64 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 72  d of all pages r
23eb0 65 61 64 20 77 69 74 68 69 6e 20 74 68 65 20 74  ead within the t
23ec0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
23ed0 20 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c    btreePtrmapDel
23ee0 65 74 65 28 70 42 74 29 3b 0a 20 20 73 71 6c 69  ete(pBt);.  sqli
23ef0 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75  te3PagerEndConcu
23f00 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  rrent(pBt->pPage
23f10 72 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  r);.  btreeInteg
23f20 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
23f30 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
23f40 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
23f50 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
23f60 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
23f70 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
23f80 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
23f90 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
23fa0 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
23fb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
23fc0 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
23fd0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
23fe0 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
23ff0 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
24000 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
24010 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
24020 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
24030 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
24040 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
24050 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
24060 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
24070 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
24080 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
24090 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
240a0 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
240b0 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
240c0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
240d0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
240e0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
240f0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
24100 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
24110 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
24120 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
24130 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
24140 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
24150 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
24160 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
24170 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
24180 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24190 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
241a0 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
241b0 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
241c0 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
241d0 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
241e0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
241f0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
24200 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
24210 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
24220 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
24230 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
24240 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24250 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
24260 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
24270 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
24280 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
24290 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
242a0 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
242b0 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
242c0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
242d0 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
242e0 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
242f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
24300 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
24310 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
24320 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
24330 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
24340 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
24350 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
24360 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
24370 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
24380 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
24390 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
243a0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
243b0 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
243c0 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
243d0 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
243e0 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
243f0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
24400 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
24410 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
24420 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
24430 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
24440 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
24450 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24460 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
24470 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
24480 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
24490 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
244a0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
244b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
244c0 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
244d0 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
244e0 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
244f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
24500 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
24510 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
24520 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
24530 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
24540 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
24550 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
24560 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
24570 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
24580 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
24590 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
245a0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
245b0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
245c0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
245d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
245e0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
245f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
24600 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
24610 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
24620 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
24630 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
24640 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
24650 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
24660 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
24670 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
24680 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
24690 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
246a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
246b0 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
246c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
246d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
246e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
246f0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74     }.    p->iDat
24700 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20  aVersion--;  /* 
24710 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70  Compensate for p
24720 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
24730 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42  ion++; */.    pB
24740 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
24750 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
24760 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
24770 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
24780 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
24790 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
247a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
247b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
247c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
247d0 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
247e0 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
247f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24800 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
24810 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
24820 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
24830 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
24840 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
24850 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
24860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24870 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
24880 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
24890 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a  PhaseTwo(p, 0);.
248a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
248b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
248c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
248d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
248e0 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
248f0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
24900 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
24910 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
24920 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
24930 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20  on any BtShared 
24940 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
24950 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69  eferences.  Or i
24960 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
24970 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31  flag is set to 1
24980 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74  , then only.** t
24990 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72  rip write cursor
249a0 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64  s and leave read
249b0 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67   cursors unchang
249c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  ed..**.** Every 
249d0 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64  cursor is a cand
249e0 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70  idate to be trip
249f0 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
24a00 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62  ursors.** that b
24a10 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64  elong to other d
24a20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
24a30 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
24a40 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67  to be.** sharing
24a50 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
24a60 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
24a70 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
24a80 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
24a90 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49  llback occurs. I
24aa0 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a  f the writeOnly.
24ab0 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ** flag is true,
24ac0 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
24ad0 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65  -cursors need be
24ae0 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d   tripped - read-
24af0 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20  only.** cursors 
24b00 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65  save their curre
24b10 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20  nt positions so 
24b20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f  that they may co
24b30 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  ntinue .** follo
24b40 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  wing the rollbac
24b50 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f  k. Or, if writeO
24b60 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c  nly is false, al
24b70 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a  l cursors are .*
24b80 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65  * tripped. In ge
24b90 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79  neral, writeOnly
24ba0 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
24bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
24bc0 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ng.** rolled bac
24bd0 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  k modified the d
24be0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
24bf0 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74  In this case b-t
24c00 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ree root.** page
24c10 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f  s may be moved o
24c20 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  r deleted from t
24c30 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f  he database alto
24c40 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a  gether, making.*
24c50 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20  * it unsafe for 
24c60 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20  read cursors to 
24c70 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
24c80 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
24c90 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e   flag is true an
24ca0 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  d an error is en
24cb0 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
24cc0 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63  .** saving the c
24cd0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
24ce0 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  of a read-only c
24cf0 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f  ursor, all curso
24d00 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  rs, .** includin
24d10 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f  g all read-curso
24d20 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a  rs are tripped..
24d30 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
24d40 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
24d50 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
24d60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
24d70 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67   while.** saving
24d80 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   a cursor positi
24d90 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  on, an SQLite er
24da0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
24db0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
24dc0 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
24dd0 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
24de0 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  rrCode, int writ
24df0 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  eOnly){.  BtCurs
24e00 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20  or *p;.  int rc 
24e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
24e20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e  assert( (writeOn
24e30 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==0 || writeOn
24e40 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57  ly==1) && BTCF_W
24e50 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  riteFlag==1 );. 
24e60 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
24e70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
24e80 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
24e90 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
24ea0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
24eb0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
24ec0 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c      if( writeOnl
24ed0 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67  y && (p->curFlag
24ee0 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
24ef0 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ag)==0 ){.      
24f00 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
24f10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
24f20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
24f30 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
24f40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
24f50 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
24f60 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
24f70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24f90 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
24fa0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
24fb0 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
24fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
24fd0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
24fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
25000 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
25010 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
25020 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
25030 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
25040 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
25050 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
25060 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52    }.      btreeR
25070 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
25080 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20  ages(p);.    }. 
25090 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
250a0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
250b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
250c0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
250d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
250e0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
250f0 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
25100 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
25110 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
25120 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
25130 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
25140 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
25150 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
25160 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
25170 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
25180 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
25190 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
251a0 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
251b0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
251c0 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
251d0 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
251e0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
251f0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
25200 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
25210 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
25220 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
25230 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
25240 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
25250 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
25260 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
25270 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
25280 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
25290 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
252a0 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
252b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
252c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
252d0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
252e0 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
252f0 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
25300 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
25310 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
25320 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
25330 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
25340 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
25350 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
25360 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
25370 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
25380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
25390 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
253a0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
253b0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
253c0 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
253d0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
253e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
253f0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
25400 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
25410 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
25420 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
25430 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
25440 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
25450 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
25460 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
25470 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
25480 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
25490 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
254a0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
254b0 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
254c0 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
254d0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
254e0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
254f0 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
25500 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
25510 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
25520 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
25530 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
25540 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
25550 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
25560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25570 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
25580 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
25590 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
255a0 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
255b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
255c0 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
255d0 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
255e0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
255f0 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
25600 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
25610 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
25620 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
25630 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
25640 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
25650 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
25660 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
25670 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
25680 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
25690 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
256a0 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
256b0 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
256c0 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
256d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
256e0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
256f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
25700 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
25710 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
25720 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
25730 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
25740 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20  geOne(pPage1);. 
25750 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
25760 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
25770 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b  rs(pBt, 1)==0 );
25780 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
25790 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
257a0 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
257b0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
257c0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
257d0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
257e0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
257f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
25800 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25810 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
25820 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
25830 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
25840 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f  action can be ro
25850 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
25860 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
25870 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
25880 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
25890 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
258a0 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
258b0 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
258c0 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
258d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
258e0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
258f0 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
25900 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
25910 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
25920 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
25930 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
25940 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
25950 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
25960 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
25970 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
25980 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
25990 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
259a0 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
259b0 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
259c0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
259d0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
259e0 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
259f0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
25a00 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
25a10 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
25a20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
25a30 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
25a40 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
25a50 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
25a60 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
25a70 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
25a80 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
25a90 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
25aa0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
25ab0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
25ac0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
25ad0 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
25ae0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
25af0 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
25b00 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
25b10 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
25b20 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
25b30 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
25b40 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
25b50 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
25b60 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
25b70 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
25b80 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
25b90 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
25ba0 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
25bb0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
25bc0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
25bd0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
25be0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
25bf0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
25c00 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
25c10 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
25c20 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
25c30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
25c40 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
25c50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
25c60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
25c70 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
25c80 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  E );.  assert( (
25c90 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
25ca0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
25cb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
25cc0 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
25cd0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
25ce0 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
25cf0 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  point );.  asser
25d00 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
25d10 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
25d20 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68  TE );.  /* At th
25d30 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
25d40 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
25d50 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
25d60 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20  point with.  ** 
25d70 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
25d80 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
25d90 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
25da0 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
25db0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
25dc0 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
25dd0 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
25de0 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
25df0 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65  y.  ** such save
25e00 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
25e10 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
25e20 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
25e30 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f   is active..  */
25e40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
25e50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
25e60 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
25e70 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 69 66  Statement);.  if
25e80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25e90 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
25ea0 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70 42 74  ePtrmapBegin(pBt
25eb0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
25ec0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
25ed0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
25ee0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25ef0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
25f00 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
25f10 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
25f20 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
25f30 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
25f40 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
25f50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
25f60 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
25f70 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
25f80 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
25f90 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
25fa0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
25fb0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
25fc0 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
25fd0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
25fe0 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
25ff0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
26000 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
26010 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
26020 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
26030 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
26040 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
26050 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
26060 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
26070 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
26080 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
26090 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
260a0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
260b0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
260c0 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
260d0 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
260e0 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
260f0 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
26100 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
26110 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
26120 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
26130 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
26140 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
26150 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
26160 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26170 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
26180 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
26190 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
261a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
261b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
261c0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
261d0 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
261e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
261f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
26200 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
26210 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
26220 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
26230 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
26240 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
26250 72 28 70 29 3b 0a 20 20 20 20 62 74 72 65 65 50  r(p);.    btreeP
26260 74 72 6d 61 70 45 6e 64 28 70 42 74 2c 20 6f 70  trmapEnd(pBt, op
26270 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
26280 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
26290 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
262a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
262b0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
262c0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
262d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
262e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
262f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
26300 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
26310 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
26320 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
26330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26340 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
26350 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
26360 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
26370 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
26380 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
26390 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
263a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
263b0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
263c0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
263d0 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
263e0 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
263f0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
26400 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
26410 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
26420 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
26430 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
26440 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
26450 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
26460 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
26470 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
26480 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
26490 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
264a0 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
264b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
264c0 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
264d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
264e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
264f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26500 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
26510 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
26520 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
26530 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
26540 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
26550 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
26560 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
26570 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
26580 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
26590 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
265a0 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
265b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
265c0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
265d0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
265e0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
265f0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
26600 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
26610 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
26620 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
26630 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
26640 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45  *.** If the BTRE
26650 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20 77  E_WRCSR bit of w
26660 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20  rFlag is clear, 
26670 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
26680 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75  can only.** be u
26690 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
266a0 20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57    If the BTREE_W
266b0 52 43 53 52 20 62 69 74 20 69 73 20 73 65 74 2c  RCSR bit is set,
266c0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
266d0 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
266e0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
266f0 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  or writing if ot
26700 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
26710 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72  or writing.** ar
26720 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
26730 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  se are the condi
26740 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
26750 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a  be met in order.
26760 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  ** for writing t
26770 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  o be allowed:.**
26780 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
26790 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
267a0 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
267b0 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Flag containing 
267c0 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a  BTREE_WRCSR.**.*
267d0 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
267e0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
267f0 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
26800 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
26810 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
26820 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
26830 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
26840 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
26850 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
26860 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
26870 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
26880 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
26890 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
268a0 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
268b0 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
268c0 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
268d0 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
268e0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
268f0 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
26900 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
26910 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
26920 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
26930 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
26940 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
26950 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
26960 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
26970 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
26980 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45  .**.** The BTREE
26990 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f  _FORDELETE bit o
269a0 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74  f wrFlag may opt
269b0 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69  ionally be set i
269c0 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  f BTREE_WRCSR.**
269d0 20 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52   is set.  If FOR
269e0 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74  DELETE is set, t
269f0 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f  hat is a hint to
26a00 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
26a10 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  ion that.** this
26a20 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c   cursor will onl
26a30 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 65 65  y be used to see
26a40 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20  k to and delete 
26a50 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e  entries of an in
26a60 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  dex.** as part o
26a70 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54  f a larger DELET
26a80 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
26a90 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74  e FORDELETE hint
26aa0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a   is not used by.
26ab0 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  ** this implemen
26ac0 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20  tation.  But in 
26ad0 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61  a hypothetical a
26ae0 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61  lternative stora
26af0 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e  ge engine .** in
26b00 20 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74   which index ent
26b10 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  ries are automat
26b20 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
26b30 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  hen correspondin
26b40 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20  g table.** rows 
26b50 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65  are deleted, the
26b60 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20   FORDELETE flag 
26b70 69 73 20 61 20 68 69 6e 74 20 74 68 61 74 20 61  is a hint that a
26b80 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45  ll SEEK and DELE
26b90 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73  TE.** operations
26ba0 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20   on this cursor 
26bb0 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e  can be no-ops an
26bc0 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61  d all READ opera
26bd0 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65  tions can .** re
26be0 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20  turn a null row 
26bf0 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30  (2-bytes: 0x01 0
26c00 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  x00)..**.** No c
26c10 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
26c20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
26c30 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
26c40 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
26c50 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
26c60 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
26c70 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
26c80 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
26c90 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
26ca0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
26cb0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
26cc0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
26cd0 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20  reeCursorZero() 
26ce0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
26cf0 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e  ** on pCur to in
26d00 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
26d10 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20  ory space prior 
26d20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
26d30 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
26d40 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
26d50 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d80 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
26d90 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26db0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
26dc0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
26dd0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
26de0 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
26e10 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
26e20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
26e30 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
26e40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
26e50 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
26e60 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
26e70 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
26ea0 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
26eb0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
26ec0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ee0 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
26ef0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75  handle */.  BtCu
26f00 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20  rsor *pX;       
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76     /* Looping ov
26f30 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72  er other all cur
26f40 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sors */..  asser
26f50 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
26f60 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
26f70 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
26f80 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  ==0 .       || w
26f90 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43  rFlag==BTREE_WRC
26fa0 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  SR .       || wr
26fb0 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43  Flag==(BTREE_WRC
26fc0 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  SR|BTREE_FORDELE
26fd0 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  TE) .  );..  /* 
26fe0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
26ff0 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
27000 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
27010 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
27020 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
27030 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
27040 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
27050 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
27060 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
27070 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
27080 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
27090 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
270a0 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
270b0 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
270c0 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
270d0 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
270e0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
270f0 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
27100 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32  fo!=0, (wrFlag?2
27110 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74  :1)) );.  assert
27120 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
27130 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
27140 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
27150 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
27160 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
27170 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
27180 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
27190 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
271a0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
271b0 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
271c0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
271d0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
271e0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
271f0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
27200 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
27210 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
27220 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28  ( wrFlag==0 || (
27230 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
27240 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
27250 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c  0 );..  if( wrFl
27260 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
27270 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
27280 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
27290 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
272a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
272b0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  M_BKPT;.  }.  if
272c0 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
272d0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
272e0 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
272f0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
27300 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
27310 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
27320 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
27330 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
27340 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
27350 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
27360 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
27370 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
27380 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
27390 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
273a0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
273b0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
273c0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
273d0 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
273e0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
273f0 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
27400 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
27410 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63  = pBt;.  pCur->c
27420 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  urFlags = wrFlag
27430 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   ? BTCF_WriteFla
27440 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  g : 0;.  pCur->c
27450 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77  urPagerFlags = w
27460 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45  rFlag ? 0 : PAGE
27470 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a  R_GET_READONLY;.
27480 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
27490 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
274a0 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
274b0 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
274c0 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73  l such.  ** curs
274d0 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20  ors *must* have 
274e0 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
274f0 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20  e flag set. */. 
27500 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75   for(pX=pBt->pCu
27510 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d  rsor; pX; pX=pX-
27520 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
27530 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28   pX->pgnoRoot==(
27540 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20  Pgno)iTable ){. 
27550 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67       pX->curFlag
27560 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
27570 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  le;.      pCur->
27580 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
27590 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d  _Multiple;.    }
275a0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65  .  }.  pCur->pNe
275b0 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
275c0 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  r;.  pBt->pCurso
275d0 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
275e0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
275f0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74  R_INVALID;.  ret
27600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27610 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27620 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
27630 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27650 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
27660 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
27670 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
27680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27690 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
276a0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
276b0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
276c0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
276f0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
27700 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
27710 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27730 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
27740 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
27750 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
27780 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
27790 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
277a0 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c   rc;.  if( iTabl
277b0 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  e<1 ){.    rc = 
277c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
277d0 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
277e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
277f0 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
27800 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
27810 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
27820 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
27830 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
27840 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
27850 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27860 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
27870 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
27880 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
27890 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
278a0 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
278b0 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
278c0 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
278d0 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
278e0 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
278f0 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
27900 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
27910 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
27920 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
27930 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
27940 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
27950 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
27960 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
27970 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
27980 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
27990 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
279a0 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
279b0 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72  (sizeof(BtCursor
279c0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
279d0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74  tialize memory t
279e0 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76  hat will be conv
279f0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43  erted into a BtC
27a00 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ursor object..**
27a10 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61  .** The simple a
27a20 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75  pproach here wou
27a30 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28  ld be to memset(
27a40 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a  ) the entire obj
27a50 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20  ect.** to zero. 
27a60 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75   But it turns ou
27a70 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67  t that the apPag
27a80 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20  e[] and aiIdx[] 
27a90 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74  arrays.** do not
27aa0 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f   need to be zero
27ab0 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  ed and they are 
27ac0 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e  large, so we can
27ad0 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f   save a lot.** o
27ae0 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b  f run-time by sk
27af0 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
27b00 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f  alization of tho
27b10 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  se elements..*/.
27b20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
27b30 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75  eCursorZero(BtCu
27b40 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  rsor *p){.  mems
27b50 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f  et(p, 0, offseto
27b60 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67  f(BtCursor, iPag
27b70 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  e));.}../*.** Cl
27b80 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
27b90 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
27ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27bb0 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
27bc0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
27bd0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
27be0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
27bf0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
27c00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
27c10 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
27c20 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
27c30 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
27c40 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
27c50 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
27c60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
27c70 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
27c80 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
27c90 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
27ca0 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
27cb0 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  or==pCur ){.    
27cc0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
27cd0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
27ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
27cf0 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d  tCursor *pPrev =
27d00 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
27d10 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
27d20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78   if( pPrev->pNex
27d30 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  t==pCur ){.     
27d40 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78       pPrev->pNex
27d50 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
27d60 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
27d70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27d80 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65      pPrev = pPre
27d90 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  v->pNext;.      
27da0 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70  }while( ALWAYS(p
27db0 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20  Prev) );.    }. 
27dc0 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
27dd0 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
27de0 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ur);.    unlockB
27df0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
27e00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27e10 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
27e20 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  low);.    sqlite
27e30 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
27e40 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  y);.    sqlite3B
27e50 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
27e60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
27e80 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
27e90 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
27ea0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
27eb0 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
27ec0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
27ed0 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
27ee0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
27ef0 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
27f00 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
27f10 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
27f20 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
27f30 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
27f40 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
27f50 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
27f60 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
27f70 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
27f80 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
27f90 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
27fa0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69  rseCell()..*/.#i
27fb0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
27fc0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
27fd0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
27fe0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
27ff0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
28000 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
28010 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
28020 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
28030 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
28040 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66  , pCur->ix, &inf
28050 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
28060 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65  CORRUPT_DB || me
28070 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
28080 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
28090 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
280a0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
280b0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
280c0 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  x).#endif.static
280d0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
280e0 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
280f0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
28100 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ){.  if( pCur->i
28110 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
28120 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
28130 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
28140 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
28150 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
28160 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26 70  Page,pCur->ix,&p
28170 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65  Cur->info);.  }e
28180 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43  lse{.    assertC
28190 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
281a0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
281b0 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
281c0 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
281d0 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
281e0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
281f0 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
28200 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
28210 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
28220 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
28230 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
28240 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
28250 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
28260 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
28270 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
28280 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
28290 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
282a0 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
282b0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
282c0 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
282d0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
282e0 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
282f0 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
28300 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
28310 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28320 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
28330 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71  NDEBUG */.int sq
28340 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
28350 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73  IsValidNN(BtCurs
28360 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
28370 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
28380 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
28390 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
283a0 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
283b0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
283c0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
283d0 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72  y or "rowid" for
283e0 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a   a table btree..
283f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28400 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  is only valid fo
28410 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
28420 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
28430 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74   a.** ordinary t
28440 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20  able btree.  If 
28450 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
28460 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74  s to an index bt
28470 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76  ree or.** is inv
28480 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74  alid, the result
28490 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
284a0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
284b0 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
284c0 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43  eeIntegerKey(BtC
284d0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
284e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
284f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
28500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28510 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28520 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
28530 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
28540 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  Key );.  getCell
28550 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
28560 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
28570 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nKey;.}../*.** R
28580 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
28590 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79   of bytes of pay
285a0 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74  load for the ent
285b0 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  ry that pCur is.
285c0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
285d0 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74  nting to.  For t
285e0 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69  able btrees, thi
285f0 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d  s will be the am
28600 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ount.** of data.
28610 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65    For index btre
28620 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  es, this will be
28630 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
28640 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
28650 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
28660 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
28670 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
28680 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
28690 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
286a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
286b0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
286c0 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
286d0 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
286e0 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
286f0 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
28700 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32  OR_VALID..*/.u32
28710 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28720 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f  loadSize(BtCurso
28730 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
28740 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
28750 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
28760 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
28770 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28780 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
28790 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
287a0 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  urn pCur->info.n
287b0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  Payload;.}../*.*
287c0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
287d0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
287e0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
287f0 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
28800 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
28810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
28820 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
28830 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
28840 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
28850 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
28860 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
28870 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
28880 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
28890 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
288a0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
288b0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
288c0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
288d0 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
288e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
288f0 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
28900 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
28910 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
28920 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
28930 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
28940 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
28950 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
28960 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
28970 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
28980 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
28990 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
289a0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
289b0 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
289c0 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
289d0 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
289e0 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
289f0 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
28a00 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
28a10 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
28a20 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
28a30 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
28a40 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
28a50 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
28a60 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
28a70 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
28a80 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
28a90 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
28aa0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
28ab0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
28ac0 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
28ad0 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
28ae0 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
28af0 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
28b00 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
28b10 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
28b20 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
28b30 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
28b40 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
28b50 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
28b60 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
28b70 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
28b80 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
28b90 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
28ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28bb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28bc0 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
28bf0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
28c00 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
28c10 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
28c20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
28c30 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
28c40 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
28c50 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
28c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
28c70 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
28c80 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
28c90 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
28ca0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
28cb0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
28cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
28cd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
28ce0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
28cf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
28d00 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
28d10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28d20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
28d30 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
28d40 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
28d50 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
28d60 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
28d70 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
28d80 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
28d90 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
28da0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
28db0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
28dc0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
28dd0 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
28de0 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
28df0 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
28e00 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
28e10 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
28e20 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
28e30 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
28e40 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
28e50 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
28e60 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
28e70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
28e80 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
28e90 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
28ea0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
28eb0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
28ec0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
28ed0 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
28ee0 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
28ef0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
28f00 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
28f10 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
28f20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
28f30 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
28f40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
28f50 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
28f60 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
28f70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
28f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28f90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
28fa0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
28fb0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
28fc0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
28fd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
28fe0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
28ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
29000 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
29010 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
29020 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
29030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29040 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
29050 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
29060 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
29070 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
29080 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
29090 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
290a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
290b0 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
290c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
290d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
290e0 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
290f0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
29100 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
29110 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
29120 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
29130 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
29140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
29150 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
29160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
29170 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
29180 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
29190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
291a0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
291b0 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
291c0 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
291d0 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
291e0 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
291f0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
29200 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
29210 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
29220 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
29230 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
29240 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
29250 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
29260 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
29270 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
29280 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
29290 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
292a0 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
292b0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
292c0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
292d0 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
292e0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
292f0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
29300 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
29310 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
29320 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
29330 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
29340 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
29350 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
29360 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
29370 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
29380 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
29390 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
293a0 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
293b0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
293c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
293d0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
293e0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29400 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
29410 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
29420 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
29430 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
29440 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
29450 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
29460 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
29470 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
29480 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
29490 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
294a0 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
294b0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
294c0 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
294d0 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
294e0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
294f0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
29500 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
29510 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
29520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29530 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29540 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
29550 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
29560 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
29570 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
29580 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
29590 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
295a0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
295b0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
295c0 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
295d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
295e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
295f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
29600 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
29610 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
29620 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
29630 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
29640 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
29650 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
29660 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
29670 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
29680 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
29690 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
296a0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
296b0 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
296c0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
296d0 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
296e0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
296f0 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
29700 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
29710 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
29720 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
29730 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
29740 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
29750 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
29760 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
29770 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
29780 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
29790 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
297a0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
297b0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
297c0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
297d0 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
297e0 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
297f0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
29800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
29810 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
29820 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
29830 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
29840 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ges.** this func
29850 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
29860 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
29870 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a  lazily populate.
29880 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
29890 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
298a0 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
298b0 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
298c0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
298d0 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
298e0 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
298f0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
29900 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
29910 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
29920 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
29930 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
29940 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
29950 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65  ated, it must be
29960 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
29970 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
29980 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
29990 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
299a0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
299b0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
299c0 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
299d0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
299e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
299f0 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
29a00 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
29a10 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
29a20 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
29a30 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
29a40 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
29a50 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
29a60 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
29a70 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
29a80 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
29a90 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
29aa0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
29ab0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
29ac0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
29ad0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
29ae0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
29af0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
29b00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
29b10 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
29b20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
29b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
29b40 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
29b50 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
29b60 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
29b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29b80 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
29b90 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
29ba0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
29bb0 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
29bc0 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
29bd0 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
29be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
29bf0 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
29c00 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
29c10 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
29c20 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
29c30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29c40 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
29c50 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
29c60 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
29c70 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
29c80 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61       /* Btree pa
29c90 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
29ca0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
29cb0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
29cc0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
29cd0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
29ce0 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
29cf0 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
29d00 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
29d10 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
29d20 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
29d30 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
29d40 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72  Buf;     /* Star
29d50 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75  t of original ou
29d60 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64  t buffer */.#end
29d70 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
29d80 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
29d90 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d   eOp==0 || eOp==
29da0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
29db0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29dc0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
29dd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
29de0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
29df0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29e00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
29e10 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
29e20 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
29e30 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
29e40 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73  o.pPayload;.  as
29e50 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
29e60 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
29e70 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73  Payload );..  as
29e80 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e  sert( aPayload >
29e90 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
29ea0 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50  .  if( (uptr)(aP
29eb0 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e  ayload - pPage->
29ec0 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75  aData) > (pBt->u
29ed0 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72  sableSize - pCur
29ee0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29  ->info.nLocal) )
29ef0 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
29f00 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
29f10 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
29f20 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
29f30 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20  error.  The.    
29f40 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  ** conditional a
29f50 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a  bove is really:.
29f60 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c      **    &aPayl
29f70 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
29f80 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
29f90 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
29fa0 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62  leSize].    ** b
29fb0 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74  ut is recast int
29fc0 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f  o its current fo
29fd0 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65  rm to avoid inte
29fe0 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f  ger overflow pro
29ff0 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20  blems.    */.   
2a000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2a010 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
2a020 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 20  e->pgno);.  }.. 
2a030 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
2a040 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
2a050 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
2a060 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
2a070 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
2a080 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
2a090 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
2a0a0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
2a0b0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
2a0c0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
2a0d0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
2a0e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
2a0f0 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
2a100 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
2a110 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
2a120 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
2a130 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
2a140 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
2a150 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
2a160 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
2a170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
2a180 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
2a190 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
2a1a0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2a1b0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
2a1c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
2a1d0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
2a1e0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
2a1f0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
2a200 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
2a210 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
2a220 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
2a230 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2a240 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
2a250 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
2a260 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
2a270 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
2a280 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
2a290 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
2a2a0 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
2a2b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76  *.    ** The aOv
2a2c0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69  erflow[] array i
2a2d0 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65  s sized at one e
2a2e0 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
2a2f0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
2a300 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ** in the overfl
2a310 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
2a320 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2a330 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
2a340 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73  page is.    ** s
2a350 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
2a360 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61  ow[0], etc. A va
2a370 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
2a380 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
2a390 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22  y.    ** means "
2a3a0 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28  not yet known" (
2a3b0 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
2a3c0 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
2a3d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
2a3e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2a3f0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2a400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
2a410 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
2a420 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
2a430 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
2a440 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
2a450 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
2a460 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66  nOvfl>pCur->nOvf
2a470 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  lAlloc ){.      
2a480 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
2a490 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61  Pgno*)sqlite3Rea
2a4a0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
2a4b0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
2a4c0 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
2a4d0 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
2a4e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
2a4f0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
2a500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a510 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2a520 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a530 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76         pCur->nOv
2a540 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a  flAlloc = nOvfl*
2a550 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  2;.          pCu
2a560 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
2a570 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
2a580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
2a590 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
2a5a0 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
2a5b0 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
2a5c0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2a5d0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
2a5e0 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  vfl;.    }else{.
2a5f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2a600 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2a610 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
2a620 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
2a630 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74  the.      ** ent
2a640 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
2a650 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
2a660 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
2a670 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20  , skip.      ** 
2a680 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
2a690 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2a6a0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
2a6b0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
2a6c0 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ze] ){.        i
2a6d0 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
2a6e0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  flSize);.       
2a6f0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
2a700 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
2a710 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  ];.        offse
2a720 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
2a730 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
2a740 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
2a750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a760 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20  && amt>0 );.    
2a770 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20  while( nextPage 
2a780 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ){.      /* If r
2a790 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
2a7a0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
2a7b0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
2a7c0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2a7d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2a7e0 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20  [iIdx]==0.      
2a7f0 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
2a800 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
2a810 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
2a820 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52           || CORR
2a830 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
2a840 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2a850 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
2a860 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  ;..      if( off
2a870 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
2a880 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2a890 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
2a8a0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
2a8b0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
2a8c0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
2a8d0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
2a8e0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
2a8f0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
2a900 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
2a910 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
2a920 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
2a930 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
2a940 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
2a950 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
2a960 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
2a970 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
2a980 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
2a990 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
2a9a0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
2a9b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2a9c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
2a9d0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2a9e0 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
2a9f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2aa00 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
2aa10 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
2aa20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
2aa30 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
2aa40 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
2aa50 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
2aa60 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
2aa70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2aa80 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
2aa90 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
2aaa0 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
2aab0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
2aac0 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
2aad0 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
2aae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2aaf0 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
2ab00 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
2ab10 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
2ab20 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
2ab30 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
2ab40 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
2ab50 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
2ab60 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
2ab70 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
2ab80 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
2ab90 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
2aba0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
2abb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
2abc0 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20  d;      /* File 
2abd0 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f  from which to do
2abe0 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77   direct overflow
2abf0 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a   read */.#endif.
2ac00 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
2ac10 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
2ac20 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
2ac30 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
2ac40 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
2ac50 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
2ac60 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
2ac70 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
2ac80 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
2ac90 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
2aca0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
2acb0 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
2acc0 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
2acd0 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
2ace0 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
2acf0 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
2ad00 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
2ad10 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
2ad20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
2ad30 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
2ad40 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 69 73  **   3) there is
2ad50 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
2ad60 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
2ad70 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
2ad80 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2ad90 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
2ada0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
2adb0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2adc0 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65   in the WAL file
2add0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
2ade0 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
2adf0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
2ae00 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68  een read into th
2ae10 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
2ae20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2ae30 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
2ae40 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
2ae50 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
2ae60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
2ae70 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
2ae80 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
2ae90 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
2aea0 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
2aeb0 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
2aec0 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
2aed0 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
2aee0 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
2aef0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2af00 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2af10 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
2af20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2af50 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
2af60 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
2af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af90 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
2afa0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
2afb0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2afc0 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20  =TRANS_READ     
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20  /* (3) */.      
2aff0 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69     && (fd = sqli
2b000 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
2b010 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74  ->pPager))->pMet
2b020 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20  hods     /* (4) 
2b030 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  */.         && 0
2b040 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55 73  ==sqlite3PagerUs
2b050 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  eWal(pBt->pPager
2b060 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20 20 20  , nextPage)     
2b070 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20    /* (5) */.    
2b080 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34       && &pBuf[-4
2b090 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20  ]>=pBufStart    
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
2b0c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
2b0d0 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
2b0e0 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
2b0f0 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
2b100 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
2b110 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74     assert( aWrit
2b120 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20  e>=pBufStart ); 
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74          /* due t
2b150 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  o (6) */.       
2b160 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
2b170 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
2b180 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2b190 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
2b1a0 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
2b1b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
2b1c0 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
2b1d0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
2b1e0 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
2b1f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
2b200 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
2b210 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
2b220 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2b230 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2b240 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
2b250 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
2b260 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2b270 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
2b280 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
2b290 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2b2a0 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52   (eOp==0 ? PAGER
2b2b0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
2b2c0 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
2b2d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2b2e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b2f0 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
2b300 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
2b310 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
2b320 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2b330 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
2b340 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
2b350 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2b360 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
2b370 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
2b380 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
2b390 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2b3a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2b3b0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
2b3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66  .            off
2b3d0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
2b3e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2b3f0 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
2b400 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74  .        if( amt
2b410 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ==0 ) return rc;
2b420 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
2b430 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
2b440 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2b450 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a  ;.      iIdx++;.
2b460 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2b470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b480 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f  & amt>0 ){.    /
2b490 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  * Overflow chain
2b4a0 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c   ends prematurel
2b4b0 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
2b4c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2b4d0 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
2b4e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b4f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
2b500 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 79   part of the pay
2b510 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77  load for the row
2b520 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63   at which that c
2b530 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63 75  ursor pCur is cu
2b540 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
2b550 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65  ing.  "amt" byte
2b560 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
2b570 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
2b580 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
2b590 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
2b5a0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43  ffset"..**.** pC
2b5b0 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69  ur can be pointi
2b5c0 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20 74  ng to either a t
2b5d0 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78  able or an index
2b5e0 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70   b-tree..** If p
2b5f0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62  ointing to a tab
2b600 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74  le btree, then t
2b610 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69  he content secti
2b620 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a  on is read.  If.
2b630 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
2b640 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ing to an index 
2b650 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65 20  b-tree then the 
2b660 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72  key section is r
2b670 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  ead..**.** For s
2b680 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
2b690 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72  ad(), the caller
2b6a0 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
2b6b0 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
2b6c0 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
2b6d0 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c   row in the tabl
2b6e0 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42  e.  For sqlite3B
2b6f0 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
2b700 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72  ed(), the.** cur
2b710 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76  sor might be inv
2b720 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65  alid or might ne
2b730 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ed to be restore
2b740 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
2b750 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ead..**.** Retur
2b760 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
2b770 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
2b780 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
2b790 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
2b7a0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
2b7b0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
2b7c0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
2b7d0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
2b7e0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
2b7f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b800 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43  BtreePayload(BtC
2b810 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
2b820 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
2b830 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
2b840 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2b850 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2b860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b870 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b880 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2b890 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2b8a0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  >=0 && pCur->pPa
2b8b0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
2b8c0 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
2b8d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2b8e0 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
2b8f0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
2b900 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
2b910 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
2b920 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2b930 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69   variant of sqli
2b940 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
2b950 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20  ) works even if 
2b960 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
2b970 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52  ot.** in the CUR
2b980 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e  SOR_VALID state.
2b990 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65    It is only use
2b9a0 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
2b9b0 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20  _blob_read().** 
2b9c0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
2b9d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b9e0 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69  T_INCRBLOB.stati
2b9f0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2ba00 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  E int accessPayl
2ba10 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74  oadChecked(.  Bt
2ba20 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20  Cursor *pCur,.  
2ba30 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33  u32 offset,.  u3
2ba40 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70  2 amt,.  void *p
2ba50 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Buf.){.  int rc;
2ba60 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
2ba70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2ba80 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
2ba90 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
2baa0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
2bab0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2bac0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
2bad0 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
2bae0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2baf0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  r);.  return rc 
2bb00 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61 79  ? rc : accessPay
2bb10 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
2bb20 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
2bb30 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2bb40 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
2bb50 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
2bb60 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
2bb70 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
2bb80 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  uf){.  if( pCur-
2bb90 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2bba0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2bbb0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2bbc0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2bbd0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
2bbe0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2bbf0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
2bc00 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f, 0);.  }else{.
2bc10 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73      return acces
2bc20 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
2bc30 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
2bc40 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a  t, pBuf);.  }.}.
2bc50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2bc60 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
2bc70 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
2bc80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
2bc90 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
2bca0 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
2bcb0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
2bcc0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
2bcd0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
2bce0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
2bcf0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
2bd00 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
2bd10 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
2bd20 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
2bd30 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
2bd40 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
2bd50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
2bd60 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
2bd70 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
2bd80 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
2bd90 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2bda0 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
2bdb0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
2bdc0 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
2bdd0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
2bde0 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
2bdf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2be00 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2be10 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
2be20 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
2be30 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
2be40 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
2be50 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
2be60 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
2be70 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
2be80 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
2be90 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
2bea0 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
2beb0 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
2bec0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
2bed0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
2bee0 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
2bef0 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
2bf00 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
2bf10 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
2bf20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2bf30 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
2bf40 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
2bf50 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
2bf60 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
2bf70 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
2bf80 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
2bf90 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
2bfa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
2bfb0 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
2bfc0 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
2bfd0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
2bfe0 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
2bff0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
2c000 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
2c010 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
2c020 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2c030 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
2c040 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
2c050 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
2c060 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
2c070 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
2c080 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
2c090 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
2c0a0 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
2c0b0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
2c0c0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
2c0d0 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
2c0e0 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20  ){.  int amt;.  
2c0f0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
2c100 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
2c110 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
2c120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c130 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2c140 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2c150 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2c160 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2c170 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2c180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
2c190 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2c1a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2c1b0 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
2c1c0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
2c1d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c1e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
2c1f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c200 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2c210 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  >pCur->pPage->aD
2c220 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ata || CORRUPT_D
2c230 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
2c240 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
2c250 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ad<pCur->pPage->
2c260 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55  aDataEnd ||CORRU
2c270 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20  PT_DB);.  amt = 
2c280 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
2c290 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69 6e  l;.  if( amt>(in
2c2a0 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t)(pCur->pPage->
2c2b0 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
2c2c0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 20  >info.pPayload) 
2c2d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
2c2e0 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73 70  is too little sp
2c2f0 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
2c300 66 6f 72 20 74 68 65 20 65 78 70 65 63 74 65 64  for the expected
2c310 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20 6f   amount.    ** o
2c320 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74 2e  f local content.
2c330 20 44 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   Database must b
2c340 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
2c350 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
2c360 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74 20  T_DB );.    amt 
2c370 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28 70  = MAX(0, (int)(p
2c380 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
2c390 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
2c3a0 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20 20  o.pPayload));.  
2c3b0 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33 32  }.  *pAmt = (u32
2c3c0 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  )amt;.  return (
2c3d0 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
2c3e0 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
2c3f0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
2c400 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
2c410 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
2c420 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
2c430 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
2c440 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
2c450 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
2c460 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
2c470 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
2c480 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
2c490 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
2c4a0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
2c4b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
2c4c0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
2c4d0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
2c4e0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
2c4f0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
2c500 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
2c510 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
2c520 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
2c530 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
2c540 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
2c550 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
2c560 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
2c570 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
2c580 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
2c590 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
2c5a0 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
2c5b0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
2c5c0 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
2c5d0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
2c5e0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
2c5f0 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
2c600 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
2c610 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
2c620 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
2c630 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
2c640 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
2c650 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  dFetch(BtCursor 
2c660 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
2c670 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
2c680 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
2c690 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
2c6a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2c6b0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
2c6c0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
2c6d0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
2c6e0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
2c6f0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
2c700 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
2c710 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
2c720 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2c730 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
2c740 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
2c750 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
2c760 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
2c770 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
2c780 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
2c790 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
2c7a0 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
2c7b0 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
2c7c0 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
2c7d0 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
2c7e0 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
2c7f0 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
2c800 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2c810 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
2c820 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
2c830 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
2c840 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
2c850 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
2c860 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2c870 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2c880 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2c890 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2c8a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2c8b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2c8c0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
2c8d0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
2c8e0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2c8f0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
2c900 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
2c910 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
2c920 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c930 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c940 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
2c950 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2c960 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2c970 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2c980 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2c990 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69  vfl);.  pCur->ai
2c9a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c9b0 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70   = pCur->ix;.  p
2c9c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c9d0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d  ->iPage] = pCur-
2c9e0 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  >pPage;.  pCur->
2c9f0 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ix = 0;.  pCur->
2ca00 69 50 61 67 65 2b 2b 3b 0a 20 20 72 63 20 3d 20  iPage++;.  rc = 
2ca10 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2ca20 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
2ca30 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20  ur->pPage,.     
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63     pCur, pCur->c
2ca60 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20  urPagerFlags);. 
2ca70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ca80 4f 4b 20 29 7b 0a 20 20 20 20 73 65 74 4d 65 6d  OK ){.    setMem
2ca90 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e 70  pageRoot(pCur->p
2caa0 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  Page, pCur->pgno
2cab0 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Root);.  }.  ret
2cac0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
2cad0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2cae0 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
2caf0 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
2cb00 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
2cb10 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
2cb20 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
2cb30 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2cb40 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2cb50 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
2cb60 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
2cb70 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
2cb80 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
2cb90 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
2cba0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
2cbb0 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
2cbc0 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
2cbd0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
2cbe0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
2cbf0 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
2cc00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2cc10 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2cc20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2cc30 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
2cc40 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20   iChild){.  if( 
2cc50 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
2cc60 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e  urn;  /* The con
2cc70 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62  ditions tested b
2cc80 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62  elow might not b
2cc90 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20  e true.         
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccb0 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
2ccc0 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  pt database */. 
2ccd0 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
2cce0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
2ccf0 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
2cd00 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2cd10 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2cd20 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2cd30 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2cd40 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
2cd50 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
2cd60 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2cd70 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2cd80 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
2cd90 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
2cda0 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
2cdb0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2cdc0 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
2cdd0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2cde0 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
2cdf0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
2ce00 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
2ce10 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
2ce20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
2ce30 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
2ce40 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
2ce50 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
2ce60 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
2ce70 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
2ce80 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
2ce90 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
2cea0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
2ceb0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
2cec0 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
2ced0 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
2cee0 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
2cef0 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
2cf00 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2cf10 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74  *pLeaf;.  assert
2cf20 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2cf30 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2cf40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2cf50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2cf60 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2cf70 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
2cf80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2cf90 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
2cfa0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
2cfb0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
2cfc0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2cfd0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2cfe0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2cff0 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67   .    pCur->pPag
2d000 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  e->pgno.  );.  t
2d010 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
2d020 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d030 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
2d040 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2d050 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43  ]->nCell );.  pC
2d060 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2d070 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2d080 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2d090 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2d0a0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
2d0b0 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  ->ix = pCur->aiI
2d0c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2d0d0 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75  ];.  pLeaf = pCu
2d0e0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72  r->pPage;.  pCur
2d0f0 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  ->pPage = pCur->
2d100 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69  apPage[--pCur->i
2d110 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65  Page];.  release
2d120 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61  PageNotNull(pLea
2d130 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  f);.}../*.** Mov
2d140 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2d150 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
2d160 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
2d170 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
2d180 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
2d190 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
2d1a0 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
2d1b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
2d1c0 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
2d1d0 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
2d1e0 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
2d1f0 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
2d200 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
2d210 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
2d220 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
2d230 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
2d240 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
2d250 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
2d260 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
2d270 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
2d280 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
2d290 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
2d2a0 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
2d2b0 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
2d2c0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
2d2d0 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
2d2e0 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
2d2f0 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
2d300 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ID and this rout
2d310 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
2d320 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77  TE_EMPTY. Otherw
2d330 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73  ise,.** the curs
2d340 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
2d350 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
2d360 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
2d370 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20  the root.** (or 
2d380 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
2d390 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
2d3a0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
2d3b0 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
2d3c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
2d3d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
2d3e0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
2d3f0 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
2d400 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
2d410 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
2d420 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
2d430 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
2d440 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
2d450 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
2d460 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
2d470 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
2d480 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
2d490 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
2d4a0 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
2d4b0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2d4c0 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
2d4d0 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
2d4e0 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
2d4f0 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
2d500 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
2d510 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
2d520 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
2d530 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
2d540 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
2d550 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
2d560 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
2d570 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
2d580 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2d590 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
2d5a0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2d5b0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
2d5c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d5d0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2d5e0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2d5f0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2d600 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2d610 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2d620 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2d630 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
2d640 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
2d650 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2d660 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
2d670 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
2d680 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2d690 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2d6a0 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e < CURSOR_REQUI
2d6b0 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e  RESEEK || pCur->
2d6c0 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73  iPage<0 );.  ass
2d6d0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2d6e0 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69  oot>0 || pCur->i
2d6f0 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28  Page<0 );..  if(
2d700 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2d710 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2d720 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
2d730 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2d740 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ll(pCur->pPage);
2d750 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d  .      while( --
2d760 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
2d770 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2d780 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
2d790 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d7a0 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ge]);.      }.  
2d7b0 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
2d7c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
2d7d0 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b  ];.      goto sk
2d7e0 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20  ip_init;.    }. 
2d7f0 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d   }else if( pCur-
2d800 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a  >pgnoRoot==0 ){.
2d810 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2d820 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2d830 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
2d840 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65  LITE_EMPTY;.  }e
2d850 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2d860 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
2d870 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  1) );.    if( pC
2d880 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
2d890 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2d8a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2d8b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2d8c0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
2d8d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d8e0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
2d8f0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2d900 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2d910 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
2d920 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2d930 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
2d940 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
2d950 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2d960 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
2d970 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2d980 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  ot, &pCur->pPage
2d990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d9a0 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75            0, pCu
2d9b0 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2d9c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d9d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d9e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2d9f0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2da00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2da10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4d  ;.    }.    setM
2da20 65 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d  empageRoot(pCur-
2da30 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 67  >pPage, pCur->pg
2da40 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43 75  noRoot);.    pCu
2da50 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
2da60 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65    pCur->curIntKe
2da70 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  y = pCur->pPage-
2da80 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
2da90 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
2daa0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  ge;.  assert( pR
2dab0 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
2dac0 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
2dad0 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
2dae0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
2daf0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
2db00 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
2db10 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
2db20 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
2db30 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
2db40 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
2db50 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
2db60 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
2db70 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
2db80 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
2db90 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2dba0 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
2dbb0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
2dbc0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
2dbd0 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
2dbe0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2dbf0 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
2dc00 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
2dc10 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
2dc20 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
2dc30 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
2dc40 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2dc50 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2dc60 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
2dc70 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
2dc80 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
2dc90 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
2dca0 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
2dcb0 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
2dcc0 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
2dcd0 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
2dce0 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
2dcf0 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
2dd00 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
2dd10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2dd20 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
2dd30 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
2dd40 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
2dd50 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
2dd60 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
2dd70 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
2dd80 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
2dd90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2dda0 5f 50 47 4e 4f 28 70 43 75 72 2d 3e 70 50 61 67  _PGNO(pCur->pPag
2ddb0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  e->pgno);.  }..s
2ddc0 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43  kip_init:  .  pC
2ddd0 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43  ur->ix = 0;.  pC
2dde0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2ddf0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2de00 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2de10 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2de20 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2de30 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d  vfl);..  pRoot =
2de40 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2de50 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
2de60 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
2de70 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2de80 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
2de90 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
2dea0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
2deb0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
2dec0 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
2ded0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2dee0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
2def0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
2df00 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
2df10 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
2df20 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
2df30 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2df40 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
2df50 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2df60 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
2df70 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
2df80 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2df90 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
2dfa0 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
2dfb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2dfc0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2dfd0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2dfe0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
2dff0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
2e000 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
2e010 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
2e020 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
2e030 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
2e040 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
2e050 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
2e060 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
2e070 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
2e080 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2e090 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2e0a0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
2e0b0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
2e0c0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
2e0d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2e0e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2e0f0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2e100 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2e110 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2e120 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2e130 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2e140 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2e150 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
2e160 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
2e170 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
2e180 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2e190 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2e1a0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2e1b0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2e1c0 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20  e, pCur->ix));. 
2e1d0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2e1e0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2e1f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2e210 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
2e220 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
2e230 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
2e240 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
2e250 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
2e260 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2e270 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
2e280 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
2e290 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
2e2a0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
2e2b0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
2e2c0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
2e2d0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
2e2e0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
2e2f0 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
2e300 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
2e310 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
2e320 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
2e330 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
2e340 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
2e350 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
2e360 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
2e370 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
2e380 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
2e390 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
2e3a0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2e3b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2e3c0 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
2e3d0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
2e3e0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
2e3f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e400 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e410 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2e420 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2e430 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2e440 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2e450 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2e460 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
2e470 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2e480 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
2e490 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2e4a0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2e4b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2e4c0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
2e4d0 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ix = pPage->nCel
2e4e0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
2e4f0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2e500 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
2e510 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
2e520 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50  .  pCur->ix = pP
2e530 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2e540 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2e550 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2e560 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2e570 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2e580 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
2e590 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2e5a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
2e5b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2e5c0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2e5d0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2e5e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2e5f0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2e600 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2e610 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2e620 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2e630 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2e640 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2e650 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2e660 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2e670 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
2e680 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e690 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2e6a0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
2e6b0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2e6c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2e6d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e6e0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2e6f0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2e700 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
2e710 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2e720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e730 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2e740 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2e750 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  l>0 );.    *pRes
2e760 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
2e770 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2e780 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ur);.  }else if(
2e790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
2e7a0 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
2e7b0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2e7c0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
2e7d0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2e7e0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2e7f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2e800 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2e810 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
2e820 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2e830 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2e840 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2e850 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
2e860 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
2e870 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
2e880 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
2e890 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
2e8a0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
2e8b0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
2e8c0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2e8d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2e8e0 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
2e8f0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2e900 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2e910 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2e920 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2e930 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2e940 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2e950 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2e960 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2e970 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2e980 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
2e990 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
2e9a0 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
2e9b0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
2e9c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
2e9d0 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70  ur->eState && (p
2e9e0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2e9f0 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2ea00 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2ea10 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
2ea20 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
2ea30 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
2ea40 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
2ea50 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
2ea60 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
2ea70 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
2ea80 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
2ea90 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
2eaa0 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
2eab0 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
2eac0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2ead0 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
2eae0 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
2eaf0 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
2eb00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d  ssert( pCur->ix=
2eb10 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  =pCur->pPage->nC
2eb20 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
2eb30 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2eb40 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
2eb50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2eb60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
2eb70 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2eb80 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
2eb90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eba0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2ebb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ebc0 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ID );.    *pRes 
2ebd0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
2ebe0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
2ebf0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ur);.    if( rc=
2ec00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ec10 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2ec20 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73  gs |= BTCF_AtLas
2ec30 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2ec40 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2ec50 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
2ec60 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  st;.    }.  }els
2ec70 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2ec80 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73  _EMPTY ){.    as
2ec90 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2eca0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2ecb0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
2ecc0 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
2ecd0 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
2ece0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
2ecf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
2ed00 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
2ed10 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2ed20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
2ed30 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
2ed40 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
2ed50 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
2ed60 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
2ed70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
2ed80 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
2ed90 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
2eda0 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
2edb0 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
2edc0 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
2edd0 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
2ede0 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
2edf0 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
2ee00 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
2ee10 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
2ee20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
2ee30 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
2ee40 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
2ee50 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
2ee60 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
2ee70 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
2ee80 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
2ee90 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
2eea0 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
2eeb0 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
2eec0 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
2eed0 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
2eee0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
2eef0 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
2ef00 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
2ef10 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
2ef20 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
2ef30 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
2ef40 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
2ef50 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
2ef60 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
2ef70 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
2ef80 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
2ef90 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
2efa0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2efb0 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
2efc0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
2efd0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2efe0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
2eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f000 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
2f010 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2f020 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
2f030 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
2f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
2f050 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
2f060 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
2f070 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
2f080 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2f090 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
2f0a0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2f0b0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2f0c0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2f0d0 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
2f0e0 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
2f0f0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
2f100 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
2f110 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2f120 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2f130 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f150 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2f160 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
2f170 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20  **.** For index 
2f180 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78  tables, the pIdx
2f190 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c  Key->eqSeen fiel
2f1a0 64 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66  d is set to 1 if
2f1b0 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73   there.** exists
2f1c0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2f1d0 20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63   table that exac
2f1e0 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78  tly matches pIdx
2f1f0 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  Key.  .*/.int sq
2f200 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2f210 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
2f220 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2f230 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
2f240 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
2f250 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
2f260 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
2f270 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
2f280 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
2f290 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
2f2a0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
2f2b0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
2f2c0 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
2f2d0 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
2f2e0 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
2f2f0 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
2f300 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
2f310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2f320 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
2f330 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
2f340 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43  nt rc;.  RecordC
2f350 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f  ompare xRecordCo
2f360 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74  mpare;..  assert
2f370 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2f380 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2f390 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2f3a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2f3b0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2f3c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2f3d0 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
2f3e0 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
2f3f0 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
2f400 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
2f410 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2f420 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2f430 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2f440 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d  Cur->curIntKey!=
2f450 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
2f460 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
2f470 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
2f480 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
2f490 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
2f4a0 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
2f4b0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
2f4c0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
2f4d0 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64  ork */.  if( pId
2f4e0 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43  xKey==0.   && pC
2f4f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2f500 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75  OR_VALID && (pCu
2f510 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2f520 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30  CF_ValidNKey)!=0
2f530 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
2f540 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
2f550 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2f560 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2f570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f590 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
2f5a0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2f5b0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
2f5c0 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2f5d0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
2f5e0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2f5f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f600 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2f610 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
2f620 65 71 75 65 73 74 65 64 20 6b 65 79 20 69 73 20  equested key is 
2f630 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
2f640 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20  e previous key, 
2f650 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72  then.      ** tr
2f660 79 20 74 6f 20 67 65 74 20 74 68 65 72 65 20 75  y to get there u
2f670 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65  sing sqlite3Btre
2f680 65 4e 65 78 74 28 29 20 72 61 74 68 65 72 20 74  eNext() rather t
2f690 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20  han a full.     
2f6a0 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63   ** binary searc
2f6b0 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  h.  This is an o
2f6c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
2f6d0 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74 20 61  .  The correct a
2f6e0 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  nswer.      ** i
2f6f0 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64  s still obtained
2f700 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 63 61   without this ca
2f710 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c  se, only a littl
2f720 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a  e more slowely *
2f730 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
2f740 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69  ->info.nKey+1==i
2f750 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72 2d 3e  ntKey && !pCur->
2f760 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2f770 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2f780 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f790 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
2f7a0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
2f7b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f7c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65   ){.          ge
2f7d0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
2f7e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2f7f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
2f800 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2f810 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f820 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2f830 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2f840 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2f850 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
2f860 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2f870 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
2f880 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2f890 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2f8a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f8b0 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65   }..  if( pIdxKe
2f8c0 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  y ){.    xRecord
2f8d0 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
2f8e0 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
2f8f0 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70  (pIdxKey);.    p
2f900 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2f910 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2f920 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2f930 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20  t_rc==1 .       
2f940 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2f950 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20  fault_rc==0 .   
2f960 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2f970 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  ->default_rc==-1
2f980 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
2f990 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2f9a0 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20  are = 0; /* All 
2f9b0 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72  keys are integer
2f9c0 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  s */.  }..  rc =
2f9d0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2f9e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2f9f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fa00 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 20  E_EMPTY ){.     
2fa10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2fa20 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2fa30 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2fa40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
2fa50 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
2fa60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2fa70 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2fa80 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2fa90 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
2faa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2fab0 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  r->pPage->isInit
2fac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2fad0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2fae0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2faf0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2fb00 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a  e->nCell > 0 );.
2fb10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2fb20 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72  iPage==0 || pCur
2fb30 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
2fb40 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key==pCur->curIn
2fb50 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  tKey );.  assert
2fb60 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
2fb70 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
2fb80 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
2fb90 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
2fba0 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  , c;.    Pgno ch
2fbb0 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
2fbc0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2fbd0 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20 2a  >pPage;.    u8 *
2fbe0 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc00 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2fc10 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2fc20 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2fc30 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2fc40 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2fc50 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2fc60 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2fc70 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2fc80 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2fc90 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2fca0 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2fcb0 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2fcc0 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2fcd0 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2fce0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2fcf0 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2fd00 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2fd10 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2fd20 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2fd30 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2fd40 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2fd50 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2fd60 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2fd70 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2fd80 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2fd90 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2fda0 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2fdb0 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2fdc0 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2fdd0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2fde0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2fdf0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2fe00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2fe10 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2fe20 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2fe30 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2fe40 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2fe50 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2fe60 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2fe70 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2fe80 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2fe90 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2fea0 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2feb0 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2fec0 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78   */.    pCur->ix
2fed0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2fee0 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2fef0 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2ff00 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2ff10 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2ff20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2ff30 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2ff40 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2ff50 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2ff60 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2ff70 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2ff80 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2ff90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ffa0 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2ffb0 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20  ->aDataEnd ){.  
2ffc0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2ffd0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ffe0 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
2fff0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  no);.           
30000 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
30010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30020 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
30030 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
30040 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
30050 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
30060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
30070 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
30080 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
30090 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
300a0 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
300b0 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
300c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
300d0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
300e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
300f0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
30100 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
30110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30120 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
30130 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
30140 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
30150 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
30160 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
30170 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30180 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
30190 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  x;.            g
301a0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f  oto moveto_next_
301b0 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20  layer;.         
301c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
301d0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
301e0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
301f0 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
30200 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
30210 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
30220 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
30230 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
30240 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
30250 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
30260 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30270 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
30280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30290 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
302a0 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
302b0 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
302c0 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
302d0 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
302e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
302f0 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
30300 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
30310 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  ll;  /* Size of 
30320 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69  the pCell cell i
30330 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
30340 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
30350 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
30360 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  , idx);..       
30370 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
30380 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
30390 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
303a0 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
303b0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
303c0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
303d0 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
303e0 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
303f0 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
30400 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
30410 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
30420 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
30430 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
30440 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
30450 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
30460 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
30470 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
30480 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
30490 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
304a0 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
304b0 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
304c0 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
304d0 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
304e0 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
304f0 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
30500 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
30510 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
30520 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
30530 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
30540 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
30550 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c      nCell = pCel
30560 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
30570 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
30580 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
30590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
305a0 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
305b0 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
305c0 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
305d0 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
305e0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
305f0 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
30600 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
30610 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
30620 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
30630 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
30640 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
30650 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
30660 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
30670 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
30680 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
30690 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
306a0 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
306b0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
306c0 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
306d0 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
306e0 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
306f0 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
30700 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
30710 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
30720 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
30730 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
30740 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
30750 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
30760 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
30770 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
30780 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
30790 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
307a0 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
307b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
307c0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
307d0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
307e0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
307f0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
30800 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
30810 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
30820 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
30830 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
30840 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
30850 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
30860 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
30870 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
30880 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
30890 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
308a0 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
308b0 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
308c0 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
308d0 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
308e0 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
308f0 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
30900 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
30910 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
30920 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
30930 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
30940 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20   called. .      
30950 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
30960 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72   ** If the recor
30970 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68  d is corrupt, th
30980 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
30990 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61   routine may rea
309a0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  d.          ** u
309b0 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73  p to two varints
309c0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
309d0 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20   the buffer. An 
309e0 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20  extra 18 .      
309f0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
30a00 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63  padding is alloc
30a10 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ated at the end 
30a20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  of the buffer in
30a30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
30a40 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  se this happens.
30a50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76    */.          v
30a60 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
30a70 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
30a80 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
30a90 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
30aa0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
30ab0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
30ac0 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
30ad0 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
30ae0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
30af0 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
30b00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
30b10 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
30b20 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20  ase( nCell<0 ); 
30b30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79    /* True if key
30b40 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72   size is 2^32 or
30b50 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   more */.       
30b60 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
30b70 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==0 );  /* Inv
30b80 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
30b90 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a  0x80 0x80 0x00 *
30ba0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
30bb0 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29  case( nCell==1 )
30bc0 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
30bd0 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
30be0 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20  80 0x01 */.     
30bf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
30c00 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d  Cell==2 );  /* M
30c10 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64  inimum legal ind
30c20 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20  ex key size */. 
30c30 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65           if( nCe
30c40 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ll<2 ){.        
30c50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30c60 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
30c70 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
30c80 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
30c90 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
30ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30cb0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
30cc0 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
30cd0 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  +18 );.         
30ce0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
30cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30d00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
30d10 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
30d20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
30d30 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
30d40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
30d50 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
30d60 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
30d70 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
30d80 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
30d90 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
30da0 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
30db0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
30dc0 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
30dd0 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
30de0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
30df0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30e00 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
30e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
30e20 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
30e30 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
30e40 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
30e50 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
30e60 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
30e70 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
30e80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
30e90 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
30ea0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
30eb0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
30ec0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
30ed0 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
30ee0 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
30ef0 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
30f00 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
30f10 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
30f20 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
30f30 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
30f40 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
30f50 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
30f60 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
30f70 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
30f80 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
30f90 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
30fa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30fb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30fc0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
30fd0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
30fe0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30ff0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
31000 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
31010 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
31020 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
31030 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
31040 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31050 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
31060 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
31070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31080 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
31090 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
310a0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
310b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
310c0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
310d0 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
310e0 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
310f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
31100 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
31110 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
31120 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
31130 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31140 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
31150 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
31160 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
31170 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
31180 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
31190 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
311a0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
311b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
311c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
311d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
311e0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
311f0 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
31200 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
31210 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
31220 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
31230 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
31240 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
31250 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
31260 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
31270 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
31280 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
31290 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
312a0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20   }.    pCur->ix 
312b0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
312c0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
312d0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
312e0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
312f0 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
31300 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
31310 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
31320 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
31330 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
31340 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
31350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31360 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
31370 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
31380 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
31390 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
313a0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
313b0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
313c0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
313d0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
313e0 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
313f0 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
31400 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
31410 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
31420 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
31430 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
31440 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
31450 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
31460 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
31470 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
31480 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
31490 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
314a0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
314b0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
314c0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
314d0 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
314e0 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
314f0 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
31500 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
31510 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
31520 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
31530 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
31540 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
31550 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
31560 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
31570 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
31580 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
31590 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
315a0 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20  an estimate for 
315b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
315c0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
315d0 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
315e0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65  pointing to.  Re
315f0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
31600 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74  number if no est
31610 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e 74  imate is current
31620 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ly .** available
31630 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
31640 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74  BtreeRowCountEst
31650 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
31660 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20  {.  i64 n;.  u8 
31670 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  i;..  assert( cu
31680 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
31690 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
316a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
316b0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
316c0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
316d0 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74  );..  /* Current
316e0 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61 63  ly this interfac
316f0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
31700 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61   by the OP_IfSma
31710 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ller.  ** opcode
31720 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63 61  , and it that ca
31730 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 69  se the cursor wi
31740 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c  ll always be val
31750 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c  id and.  ** will
31760 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f   always point to
31770 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f   a leaf node. */
31780 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
31790 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
317a0 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75 72  R_VALID) ) retur
317b0 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45  n -1;.  if( NEVE
317c0 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  R(pCur->pPage->l
317d0 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  eaf==0) ) return
317e0 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72   -1;..  n = pCur
317f0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  ->pPage->nCell;.
31800 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75    for(i=0; i<pCu
31810 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
31820 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61      n *= pCur->a
31830 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b  pPage[i]->nCell;
31840 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
31850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
31860 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
31870 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
31880 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
31890 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
318a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54  :.**.**    SQLIT
318b0 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63  E_OK        succ
318c0 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  ess.**    SQLITE
318d0 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f  _DONE      curso
318e0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
318f0 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73  nting at the las
31900 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  t element.**    
31910 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20  otherwise       
31920 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
31930 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
31940 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
31950 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
31960 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
31970 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
31980 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
31990 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
319a0 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
319b0 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
319c0 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
319d0 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
319e0 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
319f0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
31a00 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
31a10 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
31a20 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
31a30 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
31a40 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
31a50 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
31a60 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
31a70 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
31a80 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69  sor..**.** If bi
31a90 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20  t 0x01 of the F 
31aa0 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69  argument in sqli
31ab0 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46  te3BtreeNext(C,F
31ac0 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65  ) is 1, then the
31ad0 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65  .** cursor corre
31ae0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
31af0 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
31b00 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
31b10 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
31b20 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
31b30 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
31b40 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
31b50 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  e F argument.** 
31b60 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
31b70 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c   implement.  SQL
31b80 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
31b90 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
31ba0 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69  t use.** this hi
31bb0 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
31bc0 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
31bd0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
31be0 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
31bf0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
31c00 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
31c10 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
31c20 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
31c30 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
31c40 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
31c50 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
31c60 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
31c70 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
31c80 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70  VALID );.  if( p
31c90 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
31ca0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
31cb0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
31cc0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
31cd0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
31ce0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
31cf0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
31d00 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
31d10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31d20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
31d30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
31d40 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
31d50 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
31d60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31d70 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
31d80 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
31d90 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
31da0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
31db0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
31dc0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
31dd0 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
31de0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
31df0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
31e00 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
31e10 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
31e20 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t>0 ){.        p
31e30 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
31e40 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
31e50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
31e60 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
31e70 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
31e80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
31e90 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
31ea0 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
31eb0 3e 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >ix;.  assert( p
31ec0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
31ed0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
31ee0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
31ef0 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
31f00 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
31f10 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
31f20 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
31f30 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
31f40 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
31f50 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
31f60 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
31f70 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
31f80 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
31f90 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
31fa0 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
31fb0 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
31fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
31fd0 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
31fe0 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
31ff0 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
32000 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
32010 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
32020 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
32030 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
32040 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
32050 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
32060 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
32070 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
32080 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
32090 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
320a0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
320b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
320c0 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
320d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
320e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
320f0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
32100 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
32110 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
32120 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
32130 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
32140 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
32150 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
32160 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
32170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
32180 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
32190 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
321a0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
321b0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
321c0 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ix>=pPage->nCell
321d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
321e0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
321f0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
32200 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
32210 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
32220 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
32230 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
32240 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
32250 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
32260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
32270 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
32280 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
32290 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74  pCur);.  }.}.int
322a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
322b0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
322c0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
322d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
322e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
322f0 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a  ER( flags );  /*
32300 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20   Used in COMDB2 
32310 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53  but not native S
32320 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72  QLite */.  asser
32330 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
32340 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
32350 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
32360 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b  0 || flags==1 );
32370 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
32380 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
32390 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
323a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
323b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
323c0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
323d0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
323e0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
323f0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66  ValidOvfl);.  if
32400 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
32410 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
32420 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
32430 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
32440 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
32450 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29  if( (++pCur->ix)
32460 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
32470 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  {.    pCur->ix--
32480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
32490 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
324a0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
324b0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
324c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
324d0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
324e0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
324f0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
32500 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
32510 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
32520 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
32530 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
32540 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  abase..** Return
32550 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
32560 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
32570 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 20   success.**     
32580 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74 68  SQLITE_DONE   th
32590 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
325a0 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ady on the first
325b0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
325c0 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68  table.**     oth
325d0 65 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65 20  erwise     some 
325e0 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63  kind of error oc
325f0 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65  curred.**.** The
32600 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
32610 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
32620 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
32630 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
32640 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
32650 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
32660 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
32670 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
32680 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
32690 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
326a0 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
326b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
326c0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
326d0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
326e0 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
326f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
32700 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
32710 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
32720 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
32730 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
32740 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
32750 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
32760 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 74  the F argument t
32770 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  o sqlite3BtreePr
32780 65 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20 31  evious(C,F) is 1
32790 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75  , then.** the cu
327a0 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  rsor corresponds
327b0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
327c0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
327d0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
327e0 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20  n.** skipped if 
327f0 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61  the SQL index ha
32800 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20  d been a unique 
32810 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72  index.  The F ar
32820 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68  gument is a.** h
32830 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
32840 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69 76  ment.  The nativ
32850 65 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  e SQLite btree i
32860 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
32870 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68  es not.** use th
32880 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d  is hint, but COM
32890 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61  DB2 does..*/.sta
328a0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
328b0 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65  INE int btreePre
328c0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
328d0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
328e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
328f0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
32900 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
32910 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
32920 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
32930 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
32940 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
32950 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
32960 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
32970 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
32980 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
32990 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
329a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
329b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
329c0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
329d0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
329e0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
329f0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
32a00 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
32a10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32a20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
32a40 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
32a50 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
32a60 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72  State ){.      r
32a70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
32a80 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  E;.    }.    if(
32a90 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
32aa0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
32ab0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
32ac0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
32ad0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
32ae0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
32af0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
32b00 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
32b10 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
32b20 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
32b30 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
32b40 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
32b50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
32b60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
32b70 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
32b80 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
32b90 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
32ba0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
32bb0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
32bc0 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
32bd0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
32be0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
32bf0 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ix;.    rc = mov
32c00 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
32c10 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
32c20 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
32c30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
32c40 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
32c50 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
32c60 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
32c70 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
32c80 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->ix==0 ){.     
32c90 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
32ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
32cb0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
32cc0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
32cd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
32ce0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
32cf0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
32d00 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
32d10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
32d20 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
32d30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
32d40 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
32d50 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76   & (BTCF_ValidOv
32d60 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
32d70 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20  pCur->ix--;.    
32d80 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
32d90 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61  age;.    if( pPa
32da0 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
32db0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
32dc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32dd0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
32de0 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ur, 0);.    }els
32df0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
32e00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
32e10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
32e20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
32e30 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
32e40 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66  sor *pCur, int f
32e50 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
32e60 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
32e70 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
32e80 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
32e90 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20  || flags==1 );. 
32ea0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
32eb0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
32ec0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
32ed0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55 4e  OR_VALID );.  UN
32ee0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
32ef0 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65  flags );  /* Use
32f00 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20  d in COMDB2 but 
32f10 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74  not native SQLit
32f20 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72  e */.  pCur->cur
32f30 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
32f40 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
32f50 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
32f60 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69  NKey);.  pCur->i
32f70 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
32f80 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
32f90 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a  e!=CURSOR_VALID.
32fa0 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d     || pCur->ix==
32fb0 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50  0.   || pCur->pP
32fc0 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  age->leaf==0.  )
32fd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
32fe0 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 29  eePrevious(pCur)
32ff0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78  ;.  }.  pCur->ix
33000 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  --;.  return SQL
33010 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
33020 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
33030 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
33040 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
33050 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
33060 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
33070 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
33080 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
33090 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
330a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
330b0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
330c0 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
330d0 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
330e0 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
330f0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
33100 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
33110 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
33120 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
33130 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
33140 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
33150 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
33160 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
33170 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
33180 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
33190 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
331a0 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
331b0 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73  r.  *ppPage is s
331c0 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68  et to NULL in th
331d0 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
331e0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
331f0 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
33200 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
33210 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73  hen an effort is
33220 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
33230 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
33240 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
33250 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
33260 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
33270 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
33280 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
33290 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
332a0 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
332b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
332c0 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
332d0 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
332e0 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
332f0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
33300 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20  eMode parameter 
33310 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  is BTALLOC_EXACT
33320 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20   and the nearby 
33330 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61  page exists.** a
33340 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
33350 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
33360 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
33370 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
33380 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20   If.** eMode is 
33390 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20  BTALLOC_LT then 
333a0 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65  the page returne
333b0 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74  d will be less t
333c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
333d0 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79  to nearby if any
333e0 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
333f0 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20  s.  If eMode is 
33400 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e  BTALLOC_ANY then
33410 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
33420 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e   restrictions on
33430 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72   which page is r
33440 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
33450 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
33460 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
33470 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
33480 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
33490 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
334a0 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53  pPage,      /* S
334b0 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tore pointer to 
334c0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
334d0 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  ge here */.  Pgn
334e0 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20  o *pPgno,       
334f0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
33500 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72   page number her
33510 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72  e */.  Pgno near
33520 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  by,           /*
33530 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61   Search for a pa
33540 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65  ge near this one
33550 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20   */.  u8 eMode  
33560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33570 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42  BTALLOC_EXACT, B
33580 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54  TALLOC_LT, or BT
33590 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a  ALLOC_ANY */.){.
335a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
335b0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
335c0 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
335d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
335e0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
335f0 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
33600 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
33610 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
33620 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
33630 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
33640 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
33650 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
33660 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
33670 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
33680 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
33690 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
336a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
336b0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
336c0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
336d0 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  t( eMode==BTALLO
336e0 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79  C_ANY || (nearby
336f0 3e 30 20 26 26 20 52 45 51 55 49 52 45 5f 50 54  >0 && REQUIRE_PT
33700 52 4d 41 50 20 29 20 29 3b 0a 20 20 70 50 61 67  RMAP ) );.  pPag
33710 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
33720 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
33730 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
33740 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
33750 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33  OF: R-05119-0263
33760 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  7 The 4-byte big
33770 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
33780 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a  at offset 36.  *
33790 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20  * stores stores 
337a0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
337b0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
337c0 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20   freelist. */.  
337d0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
337e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
337f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
33800 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
33810 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
33820 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33830 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33840 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65    }..  /* Ensure
33850 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 61   page 1 is writa
33860 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
33870 6f 6e 20 77 69 6c 6c 20 65 69 74 68 65 72 20 63  on will either c
33880 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72  hange the number
33890 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 73 20 69  .  ** of pages i
338a0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
338b0 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
338c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
338d0 2e 20 53 69 6e 63 65 20 62 6f 74 68 0a 20 20 2a  . Since both.  *
338e0 2a 20 6f 66 20 74 68 65 73 65 20 6f 70 65 72 61  * of these opera
338f0 74 69 6f 6e 73 20 69 6e 76 6f 6c 76 65 20 6d 6f  tions involve mo
33900 64 69 66 79 69 6e 67 20 70 61 67 65 20 31 20 68  difying page 1 h
33910 65 61 64 65 72 20 66 69 65 6c 64 73 2c 20 70 61  eader fields, pa
33920 67 65 20 31 0a 20 20 2a 2a 20 77 69 6c 6c 20 64  ge 1.  ** will d
33930 65 66 69 6e 69 74 65 6c 79 20 62 65 20 77 72 69  efinitely be wri
33940 74 74 65 6e 20 62 79 20 74 68 69 73 20 74 72 61  tten by this tra
33950 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  nsaction. If thi
33960 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45  s is an CONCURRE
33970 4e 54 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  NT.  ** transact
33980 69 6f 6e 2c 20 65 6e 73 75 72 65 20 74 68 65 20  ion, ensure the 
33990 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72 75  BtreePtrmap stru
339a0 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 20 61  cture has been a
339b0 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20  llocated.  */.  
339c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
339d0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
339e0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
339f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
33a00 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
33a10 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
33a20 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
33a30 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
33a40 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
33a50 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
33a60 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
33a70 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
33a80 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
33a90 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
33aa0 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
33ab0 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20      u32 nSearch 
33ac0 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20  = 0;   /* Count 
33ad0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
33ae0 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73   search attempts
33af0 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
33b00 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
33b10 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
33b20 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
33b30 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
33b40 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
33b50 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
33b60 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
33b70 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
33b80 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
33b90 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
33ba0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
33bb0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
33bc0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
33bd0 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20  LOC_EXACT ){.   
33be0 20 20 20 61 73 73 65 72 74 28 20 49 53 41 55 54     assert( ISAUT
33bf0 4f 56 41 43 55 55 4d 21 3d 49 53 43 4f 4e 43 55  OVACUUM!=ISCONCU
33c00 52 52 45 4e 54 20 29 3b 0a 20 20 20 20 20 20 69  RRENT );.      i
33c10 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
33c20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
33c30 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
33c40 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 54  .          u8 eT
33c50 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ype;.          a
33c60 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
33c70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
33c80 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
33c90 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
33ca0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
33cb0 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
33cc0 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
33cd0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
33ce0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
33cf0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
33d00 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
33d10 20 20 20 20 20 20 20 20 20 20 20 20 73 65 61 72              sear
33d20 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
33d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33d40 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
33d50 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
33d60 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
33d70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f     }else if( eMo
33d80 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
33d90 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69  {.      searchLi
33da0 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  st = 1;.    }.. 
33db0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
33dc0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
33dd0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
33de0 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
33df0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
33e00 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
33e10 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
33e20 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
33e30 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
33e40 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
33e50 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
33e60 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
33e70 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
33e80 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
33e90 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
33ea0 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
33eb0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
33ec0 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
33ed0 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
33ee0 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
33ef0 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
33f00 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
33f10 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
33f20 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
33f30 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
33f40 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72  EXACT).    ** or
33f50 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65   until a page le
33f60 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27  ss than 'nearby'
33f70 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
33f80 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a  de==BTALLOC_LT).
33f90 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
33fa0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
33fb0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
33fc0 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
33fd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
33fe0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35  IDENCE-OF: R-015
33ff0 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72  06-11053 The fir
34000 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  st integer on a 
34010 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
34020 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  age.        ** i
34030 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
34040 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72  r of the next fr
34050 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
34060 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72  e in the list or
34070 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  .        ** zero
34080 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
34090 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72  last freelist tr
340a0 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  unk page. */.   
340b0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
340c0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
340d0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
340e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
340f0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
34100 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39  OF: R-59841-1379
34110 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  8 The 4-byte big
34120 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
34130 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20  at offset 32.   
34140 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74       ** stores t
34150 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
34160 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
34170 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
34180 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20  , or zero if.   
34190 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
341a0 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a  list is empty. *
341b0 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
341c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
341d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
341e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
341f0 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
34200 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
34210 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
34220 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20  ge || nSearch++ 
34230 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  > n ){.        r
34240 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34250 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72 75  PT_PGNO(pPrevTru
34260 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b 2d  nk ? pPrevTrunk-
34270 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20 20  >pgno : 1);.    
34280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34290 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
342a0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54  usedPage(pBt, iT
342b0 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
342c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
342d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
342e0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
342f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
34300 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
34310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
34320 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
34330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34340 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
34350 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   );.      /* EVI
34360 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32  DENCE-OF: R-1352
34370 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f  3-04394 The seco
34380 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  nd integer on a 
34390 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
343a0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
343b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
343c0 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  af page pointers
343d0 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20   to follow. */. 
343e0 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
343f0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
34400 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
34410 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
34420 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
34430 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
34440 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
34450 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
34460 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
34470 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
34480 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
34490 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
344a0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
344b0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
344c0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
344d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
344e0 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
344f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
34500 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34510 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
34520 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34530 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
34540 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
34550 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
34560 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
34570 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
34580 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
34590 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
345a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
345b0 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
345c0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
345d0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
345e0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
345f0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
34600 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
34610 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
34620 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
34630 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
34640 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
34650 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
34660 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
34670 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
34680 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
34690 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
346a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
346b0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69  E_CORRUPT_PGNO(i
346c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
346d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
346e0 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
346f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
34700 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
34710 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
34720 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t .            &
34730 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  & (nearby==iTrun
34740 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61  k || (iTrunk<nea
34750 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
34760 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
34770 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
34780 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
34790 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
347a0 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
347b0 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
347c0 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
347d0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
347e0 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
347f0 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
34800 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  */.        *pPgn
34810 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
34820 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
34830 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
34840 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
34850 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34860 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
34870 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
34880 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
34890 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
348a0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
348b0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
348c0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
348d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
348e0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
348f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
34900 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34910 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
34920 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
34930 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34940 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
34950 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34960 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
34970 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
34980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34990 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
349a0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
349b0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
349c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
349d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
349e0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
349f0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
34a00 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
34a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34a30 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
34a40 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
34a50 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
34a60 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
34a70 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
34a80 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
34a90 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
34aa0 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
34ab0 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
34ac0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
34ad0 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
34ae0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
34af0 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
34b00 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
34b10 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
34b20 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
34b30 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
34b40 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
34b50 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
34b60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
34b70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
34b80 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
34b90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
34ba0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
34bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34bc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34bd0 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
34be0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
34bf0 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
34c00 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  edPage(pBt, iNew
34c10 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
34c20 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
34c30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34c40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
34c50 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
34c60 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
34c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34c80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34c90 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
34ca0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
34cb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34cd0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
34ce0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
34cf0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
34d00 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
34d10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
34d20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
34d30 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
34d40 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
34d50 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
34d60 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
34d70 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
34d80 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
34d90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
34da0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
34db0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
34dc0 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
34dd0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
34de0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
34df0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
34e00 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
34e10 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
34e20 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
34e30 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
34e40 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
34e50 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
34e60 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
34e70 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
34e80 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
34e90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34eb0 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
34ec0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
34ed0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
34ee0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
34ef0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
34f00 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
34f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34f20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
34f30 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
34f40 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
34f50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
34f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
34f70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
34f80 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
34f90 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
34fa0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
34fb0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
34fc0 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
34fd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30     }else if( k>0
34fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
34ff0 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
35000 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
35010 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73          u32 clos
35020 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
35030 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
35040 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
35050 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
35060 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69  aData;.        i
35070 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
35080 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
35090 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
350a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
350b0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
350c0 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
350d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
350e0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
350f0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
35100 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
35110 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  8+i*4]);.       
35120 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
35130 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  <=nearby ){.    
35140 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
35150 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
35160 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
35170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
35180 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
35190 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
351a0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
351b0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
351c0 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41   dist = sqlite3A
351d0 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
351e0 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
351f0 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
35200 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
35210 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
35220 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
35230 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
35240 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
35250 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  i*4]) - nearby);
35260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
35270 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
35280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
35290 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
352a0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
352b0 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
352c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
352d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
352e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
352f0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
35300 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
35310 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
35320 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
35330 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
35340 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
35350 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
35360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
35370 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20  Page>mxPage ){. 
35380 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
35390 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
353a0 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  O(iTrunk);.     
353b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
353c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
353d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
353e0 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
353f0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
35400 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
35410 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  t .         || (
35420 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c  iPage==nearby ||
35430 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26   (iPage<nearby &
35440 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
35450 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29  _LE)) .        )
35460 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
35470 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
35480 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
35490 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
354a0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
354b0 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
354c0 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
354d0 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
354e0 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
354f0 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
35500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
35510 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
35520 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
35530 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
35540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35550 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
35560 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
35570 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
35580 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
35590 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
355a0 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
355b0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
355c0 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
355d0 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
355e0 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
355f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35600 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
35610 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
35620 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74            noCont
35630 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48  ent = !btreeGetH
35640 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a  asContent(pBt, *
35650 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45  pPgno)? PAGER_GE
35660 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b  T_NOCONTENT : 0;
35670 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35680 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
35690 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
356a0 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
356b0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
356c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
356d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
356e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
356f0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
35700 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
35710 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
35720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35730 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
35740 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
35750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
35760 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
35770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
35790 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
357a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
357b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
357c0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
357d0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
357e0 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
357f0 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
35800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
35810 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
35820 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
35830 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20  st, so append a 
35840 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a  new page to the.
35850 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
35860 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  image..    **.  
35870 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e    ** Normally, n
35880 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74  ew pages allocat
35890 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
358a0 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65   can be requeste
358b0 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  d from the.    *
358c0 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  * pager layer wi
358d0 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
358e0 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68  nt' flag set. Th
358f0 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  is prevents the 
35900 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f  pager.    ** fro
35910 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64  m trying to read
35920 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65   the pages conte
35930 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f  nt from disk. Ho
35940 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20  wever, if the.  
35950 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61    ** current tra
35960 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
35970 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20  eady run one or 
35980 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  more incremental
35990 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73  -vacuum.    ** s
359a0 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70  teps, then the p
359b0 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74  age we are about
359c0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79   to allocate may
359d0 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74   contain content
359e0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
359f0 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
35a00 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
35a10 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
35a20 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  e, do.    ** not
35a30 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74   set the no-cont
35a40 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63  ent flag. This c
35a50 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20  auses the pager 
35a60 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72  to load and jour
35a70 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  nal.    ** the c
35a80 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
35a90 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77  ent before overw
35aa0 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
35ab0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
35ac0 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  at the pager wil
35ad0 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  l not actually a
35ae0 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f  ttempt to load o
35af0 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  r journal .    *
35b00 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  * content for an
35b10 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c  y page that real
35b20 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74  ly does lie past
35b30 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
35b40 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
35b50 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  file on disk. So
35b60 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
35b70 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f  disabling the no
35b80 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a  -content optimiz
35b90 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72  ation.    ** her
35ba0 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74  e are confined t
35bb0 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68  o those pages th
35bc0 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74  at lie between t
35bd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
35be0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
35bf0 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20  age and the end 
35c00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
35c10 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
35c20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20   int bNoContent 
35c30 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41  = (0==IfNotOmitA
35c40 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
35c50 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  te))? PAGER_GET_
35c60 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20  NOCONTENT:0;..  
35c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35c80 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
35c90 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
35ca0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
35cb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
35cc0 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
35cd0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
35ce0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
35cf0 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
35d00 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
35d10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
35d20 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
35d30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
35d40 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
35d50 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
35d60 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
35d70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
35d80 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
35d90 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
35da0 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
35db0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
35dc0 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
35dd0 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
35de0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
35df0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
35e00 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
35e10 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
35e20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
35e30 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
35e40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
35e50 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
35e60 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
35e70 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
35e80 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
35e90 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
35ea0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
35eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
35ec0 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
35ed0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
35ee0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
35ef0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
35f00 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
35f10 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
35f20 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
35f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35f40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
35f50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35f60 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
35f70 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
35f80 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
35f90 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
35fa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
35fb0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
35fc0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
35fd0 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
35fe0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
35ff0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
36000 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
36010 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
36020 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
36030 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
36040 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
36050 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
36060 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
36070 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
36080 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
36090 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
360a0 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
360b0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
360c0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  Content);.    if
360d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
360e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
360f0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
36100 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
36110 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
36120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36130 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
36140 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
36150 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Page = 0;.    }.
36160 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
36170 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
36180 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
36190 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
361a0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
361b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
361c0 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
361d0 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
361e0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
361f0 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
36200 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
36210 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
36220 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
36230 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
36240 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
36250 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61  bPage)<=1 );.  a
36260 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
36270 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65  E_OK || (*ppPage
36280 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  )->isInit==0 );.
36290 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
362a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
362b0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
362c0 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
362d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
362e0 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
362f0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
36300 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
36310 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
36320 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
36330 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
36340 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
36350 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
36360 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
36370 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
36380 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
36390 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
363a0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
363b0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
363c0 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
363d0 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
363e0 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
363f0 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
36400 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
36410 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
36420 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
36430 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
36440 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
36450 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
36460 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
36470 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
36480 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
36490 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
364a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
364b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
364c0 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
364d0 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
364e0 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
364f0 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
36500 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
36510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36520 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
36530 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
36540 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
36550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36560 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
36570 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
36580 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
36590 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
365a0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
365b0 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
365c0 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
365d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
365e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365f0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
36600 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
36610 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
36620 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
36630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36640 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
36650 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
36660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36670 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
36680 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
36690 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
366a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
366b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
366c0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
366d0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
366e0 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20  T_DB || iPage>1 
366f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
36700 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
36710 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
36720 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c  );..  if( iPage<
36730 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  2 ) return SQLIT
36740 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
36750 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
36760 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
36770 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
36780 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
36790 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
367a0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
367b0 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
367c0 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
367d0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
367e0 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
367f0 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
36800 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
36810 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
36820 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
36830 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
36840 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
36850 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
36860 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
36870 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
36880 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
36890 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
368a0 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
368b0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
368c0 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
368d0 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
368e0 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
368f0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
36900 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
36910 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
36920 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
36930 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
36940 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
36950 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
36960 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
36970 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
36980 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
36990 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
369a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
369b0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
369c0 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
369d0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
369e0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
369f0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
36a00 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
36a10 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
36a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
36a30 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
36a40 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
36a50 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
36a60 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
36a70 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
36a80 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
36a90 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
36aa0 0a 20 20 69 66 28 20 52 45 51 55 49 52 45 5f 50  .  if( REQUIRE_P
36ab0 54 52 4d 41 50 20 29 7b 0a 20 20 20 20 70 74 72  TRMAP ){.    ptr
36ac0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
36ad0 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
36ae0 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
36af0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
36b00 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
36b10 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
36b20 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
36b30 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
36b40 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
36b50 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
36b60 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
36b70 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
36b80 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
36b90 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
36ba0 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
36bb0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
36bc0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
36bd0 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
36be0 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
36bf0 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
36c00 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
36c10 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
36c20 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
36c30 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
36c40 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
36c50 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
36c60 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
36c70 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
36c80 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
36c90 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
36ca0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
36cb0 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
36cc0 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
36cd0 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
36ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
36cf0 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
36d00 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
36d10 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
36d20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
36d30 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
36d40 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
36d50 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
36d60 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
36d70 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
36d80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36d90 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
36da0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
36db0 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
36dc0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
36dd0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73  ata[4]);.    ass
36de0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
36df0 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69  Size>32 );.    i
36e00 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29  f( nLeaf > (u32)
36e10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
36e20 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
36e30 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
36e40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
36e50 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
36e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36e70 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74  nLeaf < (u32)pBt
36e80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
36e90 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
36ea0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
36eb0 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
36ec0 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
36ed0 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
36ee0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
36ef0 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
36f00 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
36f10 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
36f20 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
36f30 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
36f40 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
36f50 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
36f60 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
36f70 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
36f80 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
36f90 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
36fa0 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
36fb0 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
36fc0 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
36fd0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
36fe0 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
36ff0 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
37000 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
37010 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
37020 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
37030 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
37040 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
37050 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
37060 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
37070 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
37080 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
37090 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
370a0 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
370b0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
370c0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
370d0 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
370e0 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
370f0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
37100 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
37110 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
37120 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
37130 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
37140 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
37150 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
37160 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
37170 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
37180 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
37190 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
371a0 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
371b0 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
371c0 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
371d0 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
371e0 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
371f0 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
37200 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d  NCE-OF: R-19920-
37210 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e  11576 However, n
37220 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
37230 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20   SQLite still.  
37240 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69      ** avoid usi
37250 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20  ng the last six 
37260 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66  entries in the f
37270 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
37280 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20  ge array in.    
37290 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20    ** order that 
372a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
372b0 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20  reated by newer 
372c0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
372d0 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  te can be.      
372e0 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72  ** read by older
372f0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
37300 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ite..      */.  
37310 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37320 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
37330 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
37340 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37360 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
37370 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
37380 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
37390 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
373a0 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
373b0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
373c0 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28    if( pPage && (
373d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
373e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
373f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
37400 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
37410 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
37420 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
37430 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
37440 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
37450 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
37460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
37470 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
37480 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
37490 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
374a0 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
374b0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
374c0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
374d0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
374e0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
374f0 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
37500 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
37510 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
37520 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
37530 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
37540 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
37550 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
37560 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
37570 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
37580 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
37590 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
375a0 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
375b0 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
375c0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
375d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
375e0 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
375f0 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
37600 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
37610 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
37620 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
37630 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
37640 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
37650 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
37660 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
37670 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
37680 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
37690 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
376a0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
376b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
376c0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
376d0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
376e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
376f0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
37700 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
37710 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
37720 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
37730 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
37740 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
37750 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
37760 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
37770 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
37780 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
37790 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
377a0 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
377b0 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
377c0 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
377d0 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
377e0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
377f0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
37800 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
37810 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
37820 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
37830 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
37840 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
37850 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
37860 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
37870 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
37880 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
37890 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
378a0 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
378b0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
378c0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
378d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
378e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
378f0 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20  he given Cell.  
37900 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  Write the.** loc
37910 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68  al Cell size (th
37920 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
37930 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  s on the origina
37940 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67  l page, omitting
37950 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e  .** overflow) in
37960 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73  to *pnSize..*/.s
37970 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
37980 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
37990 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
379a0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
379b0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65   contains the Ce
379c0 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
379d0 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
379e0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
379f0 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  f the Cell */.  
37a00 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
37a10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
37a20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
37a30 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  ut the cell */.)
37a40 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
37a50 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  t;.  Pgno ovflPg
37a60 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
37a70 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32  int nOvfl;.  u32
37a80 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
37a90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37aa0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
37ab0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
37ac0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  );.  pPage->xPar
37ad0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
37ae0 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69  ell, pInfo);.  i
37af0 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  f( pInfo->nLocal
37b00 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61  ==pInfo->nPayloa
37b10 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
37b20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
37b30 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
37b40 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
37b50 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
37b60 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
37b70 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d  ll+pInfo->nSize-
37b80 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  1 > pPage->aData
37b90 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
37ba0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20   ){.    /* Cell 
37bb0 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
37bc0 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   of page */.    
37bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
37be0 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
37bf0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 6f  ->pgno);.  }.  o
37c00 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
37c10 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f  te(pCell + pInfo
37c20 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  ->nSize - 4);.  
37c30 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
37c40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
37c50 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
37c60 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
37c70 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
37c80 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
37c90 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   = (pInfo->nPayl
37ca0 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  oad - pInfo->nLo
37cb0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
37cc0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
37cd0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
37ce0 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
37cf0 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
37d00 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
37d10 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
37d20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
37d30 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
37d40 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
37d50 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
37d60 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
37d70 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
37d80 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
37d90 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
37da0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
37db0 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
37dc0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
37dd0 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
37de0 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
37df0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
37e00 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
37e10 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
37e20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
37e30 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
37e40 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
37e50 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
37e60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
37e70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
37e80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
37e90 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
37ea0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
37eb0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
37ec0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
37ed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
37ee0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
37ef0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
37f00 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
37f10 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
37f20 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
37f30 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
37f40 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
37f50 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
37f60 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
37f70 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
37f80 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
37f90 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
37fa0 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
37fb0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
37fc0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
37fd0 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
37fe0 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
37ff0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
38000 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
38010 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
38020 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
38030 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
38040 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
38050 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
38060 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
38070 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
38080 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
38090 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
380a0 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
380b0 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
380c0 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
380d0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
380e0 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
380f0 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
38100 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
38110 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
38120 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
38130 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
38140 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
38150 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
38160 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
38170 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
38180 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
38190 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
381a0 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
381b0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
381c0 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
381d0 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
381e0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
381f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
38200 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
38210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
38220 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
38230 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
38240 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
38250 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
38260 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
38270 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
38280 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
38290 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
382a0 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
382b0 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
382c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
382d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
382e0 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
382f0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
38300 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
38310 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
38320 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
38330 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
38340 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
38350 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
38360 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
38370 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
38380 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
38390 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
383a0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
383b0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
383c0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
383d0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
383e0 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
383f0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
38400 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
38410 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
38420 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
38430 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
38440 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
38450 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
38460 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
38470 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
38480 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** b