/ Hex Artifact Content
Login

Artifact 828485509abc548bfd5f0a5d9b7b619a5c5d94350fb9194d130f54e7b09612b3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
3e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e50: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a  _CONCURRENT./*.*
3e60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e70: 73 74 72 75 63 74 75 72 65 20 2d 20 42 74 72 65  structure - Btre
3e80: 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72 65 73  ePtrmap - stores
3e90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
3ea0: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 75 73  ointer map.** us
3eb0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61 6c 6c  ed for newly all
3ec0: 6f 63 61 74 65 64 20 70 61 67 65 73 20 69 6e 20  ocated pages in 
3ed0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
3ee0: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3ef0: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3f00: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3f10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3f20: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3f30: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3f40: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3f50: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3f60: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3f70: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3f80: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3f90: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3fa0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fb0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3fc0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fd0: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3fe0: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3ff0: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
4000: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
4010: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
4020: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
4030: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
4040: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
4050: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4070: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
4080: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
4090: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
40c0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
40d0: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
40e0: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4100: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
4110: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
4120: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4140: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
4150: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
4160: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
4190: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
41a0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
41d0: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
41e0: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
41f0: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
4200: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4210: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
4220: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
4230: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4260: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4270: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
4280: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
4290: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
42a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
42b0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
42c0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64  ies */.};../* !d
42d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
42e0: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
42f0: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
4300: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
4310: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4320: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
4330: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
4340: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
4350: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
4360: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
4390: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
43a0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
43b0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
43c0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
43d0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
43e0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
43f0: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4400: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4410: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4420: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4430: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4440: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4460: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4470: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
4490: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
44a0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
44b0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
44c0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
44d0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
44e0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
44f0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4500: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4510: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4520: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4530: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4550: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4570: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4580: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
4590: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
45a0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
45b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
45c0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
45d0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
45e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
45f0: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4600: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4610: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4630: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4640: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4650: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4660: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4670: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4680: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
4690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
46a0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
46b0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
46c0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
46d0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
46e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
46f0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4700: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4710: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4720: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4730: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4740: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4750: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4760: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4770: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4780: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4790: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
47c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
47d0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
47e0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
47f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4800: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4810: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4840: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4850: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4860: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4870: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4880: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
4890: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
48a0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
48b0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
48c0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
48d0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
48e0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
48f0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4900: 6f 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ollback++;.    }
4910: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
4920: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4930: 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50   */.    pMap->aP
4940: 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e  tr[iEntry].paren
4950: 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  t = parent;.    
4960: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4970: 79 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65  y].eType = eType
4980: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
49b0: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
49c0: 29 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76  ).**.** Open sav
49d0: 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
49e0: 74 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  t, if it is not 
49f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f  already open..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4a10: 65 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53  ePtrmapBegin(BtS
4a20: 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
4a30: 6e 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  nSvpt){.  BtreeP
4a40: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4a50: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4a60: 4d 61 70 20 26 26 20 6e 53 76 70 74 3e 70 4d 61  Map && nSvpt>pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
4a90: 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70  Svpt>=pMap->nSvp
4aa0: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  tAlloc ){.      
4ab0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4ac0: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d  >nSvptAlloc ? pM
4ad0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32  ap->nSvptAlloc*2
4ae0: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74   : 16;.      int
4af0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
4b00: 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61  _realloc(pMap->a
4b10: 53 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Svpt, sizeof(int
4b20: 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ) * nNew);.     
4b30: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b70: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20    pMap->aSvpt = 
4b80: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4b90: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d  ap->nSvptAlloc =
4ba0: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4bb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
4bc0: 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e  pMap->nSvpt; i<n
4bd0: 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Svpt; i++){.    
4be0: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d    pMap->aSvpt[i]
4bf0: 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61   = pMap->nRollba
4c00: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  ck;.    }.    pM
4c10: 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70  ap->nSvpt = nSvp
4c20: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4c40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c50: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c60: 54 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  T).**.** Rollbac
4c70: 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f  k (if op==SAVEPO
4c80: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72  INT_ROLLBACK) or
4c90: 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d   release (if op=
4ca0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4cb0: 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  SE).** savepoint
4cc0: 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   iSvpt..*/.stati
4cd0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d  c void btreePtrm
4ce0: 61 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a  apEnd(BtShared *
4cf0: 70 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  pBt, int op, int
4d00: 20 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65   iSvpt){.  Btree
4d10: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4d20: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4d30: 70 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  pMap ){.    asse
4d40: 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
4d50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70  T_ROLLBACK || op
4d60: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4d70: 41 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ASE );.    asser
4d80: 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28  t( iSvpt>=0 || (
4d90: 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  iSvpt==-1 && op=
4da0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4db0: 41 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ACK) );.    if( 
4dc0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20  iSvpt<0 ){.     
4dd0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30   pMap->nSvpt = 0
4de0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4df0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
4e00: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e     memset(pMap->
4e10: 61 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aPtr, 0, sizeof(
4e20: 50 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50  Pgno) * pMap->nP
4e30: 74 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65  trAlloc);.    }e
4e40: 6c 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d  lse if( iSvpt<pM
4e50: 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20  ap->nSvpt ){.   
4e60: 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
4e70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
4e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4e90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ea0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d  pMap->nRollback-
4eb0: 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76  1; ii>=pMap->aSv
4ec0: 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29  pt[iSvpt]; ii--)
4ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c  {.          Roll
4ee0: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4ef0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4f00: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ii];.          P
4f10: 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
4f20: 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
4f30: 5b 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d  [p->pgno - pMap-
4f40: 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  >iFirst];.      
4f50: 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65      pEntry->pare
4f60: 6e 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a  nt = p->parent;.
4f70: 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
4f80: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
4f90: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70      }.      pMap
4fb0: 2d 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20  ->nSvpt = iSvpt 
4fc0: 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
4fd0: 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
4fe0: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4ff0: 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b  k = pMap->aSvpt[
5000: 69 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20  iSvpt];.    }.  
5010: 7d 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64  }.}../* !defined
5020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e  (SQLITE_OMIT_CON
5030: 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54  CURRENT).**.** T
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5050: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
5060: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
5070: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
5080: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
5090: 61 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65  ase. It allocate
50a0: 73 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  s the BtreePtrma
50b0: 70 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  p structure used
50c0: 20 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65   to track pointe
50d0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  rs.** to allocat
50e0: 65 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72  ed pages and zer
50f0: 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
5100: 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
5110: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
5120: 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31  header on page 1
5130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5140: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5150: 61 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ate(BtShared *pB
5160: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5180: 70 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  pBt->pMap==0 ){.
5190: 20 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20      BtreePtrmap 
51a0: 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f  *pMap = sqlite3_
51b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  malloc(sizeof(Bt
51c0: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
51d0: 20 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a   if( pMap==0 ){.
51e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
51f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
5210: 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
5220: 44 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a  Data[32], 0, siz
5230: 65 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20  eof(u32)*2);.   
5240: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20     memset(pMap, 
5250: 30 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  0, sizeof(BtreeP
5260: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70  trmap));.      p
5270: 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42  Map->iFirst = pB
5280: 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20  t->nPage + 1;.  
5290: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
52a0: 70 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pMap;.    }.  }.
52b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
52e0: 4e 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61  NT).**.** Free a
52f0: 6e 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  ny BtreePtrmap s
5300: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
5310: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
5320: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65   call to.** btre
5330: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
5340: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5350: 64 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c  d btreePtrmapDel
5360: 65 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ete(BtShared *pB
5370: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
5380: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
5390: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
53a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
53b0: 72 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62  ree(pMap->aRollb
53c0: 61 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ack);.    sqlite
53d0: 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74  3_free(pMap->aPt
53e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
53f0: 66 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74  free(pMap->aSvpt
5400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5410: 72 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70  ree(pMap);.    p
5420: 42 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20  Bt->pMap = 0;.  
5430: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  }.}../*.** Check
5440: 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
5450: 72 2d 6d 61 70 20 64 6f 65 73 20 6e 6f 74 20 63  r-map does not c
5460: 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
5470: 65 73 20 77 69 74 68 20 61 20 70 61 72 65 6e 74  es with a parent
5480: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 30 2e 20 43  .** page of 0. C
5490: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
54a0: 29 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  ) multiple times
54b0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 65   to output the e
54c0: 6e 74 69 72 65 0a 2a 2a 20 64 61 74 61 20 73 74  ntire.** data st
54d0: 72 75 63 74 75 72 65 20 69 66 20 69 74 20 64 6f  ructure if it do
54e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
54f0: 69 64 20 62 74 72 65 65 50 74 72 6d 61 70 43 68  id btreePtrmapCh
5500: 65 63 6b 28 42 74 53 68 61 72 65 64 20 2a 70 42  eck(BtShared *pB
5510: 74 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  t, Pgno nPage){.
5520: 20 20 50 67 6e 6f 20 69 3b 0a 20 20 69 6e 74 20    Pgno i;.  int 
5530: 62 50 72 6f 62 6c 65 6d 20 3d 20 30 3b 0a 20 20  bProblem = 0;.  
5540: 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 20 3d  BtreePtrmap *p =
5550: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 0a 20 20 66   pBt->pMap;..  f
5560: 6f 72 28 69 3d 70 2d 3e 69 46 69 72 73 74 3b 20  or(i=p->iFirst; 
5570: 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
5580: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
5590: 2a 70 45 6e 74 72 79 20 3d 20 26 70 2d 3e 61 50  *pEntry = &p->aP
55a0: 74 72 5b 69 2d 70 2d 3e 69 46 69 72 73 74 5d 3b  tr[i-p->iFirst];
55b0: 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d  .    if( pEntry-
55c0: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f  >eType==PTRMAP_O
55d0: 56 45 52 46 4c 4f 57 31 0a 20 20 20 20 20 7c 7c  VERFLOW1.     ||
55e0: 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d   pEntry->eType==
55f0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
5600: 0a 20 20 20 20 20 7c 7c 20 70 45 6e 74 72 79 2d  .     || pEntry-
5610: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42  >eType==PTRMAP_B
5620: 54 52 45 45 0a 20 20 20 20 29 7b 0a 20 20 20 20  TREE.    ){.    
5630: 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 70 61    if( pEntry->pa
5640: 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
5650: 20 20 20 62 50 72 6f 62 6c 65 6d 20 3d 20 31 3b     bProblem = 1;
5660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5680: 7d 0a 0a 20 20 69 66 28 20 62 50 72 6f 62 6c 65  }..  if( bProble
5690: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  m ){.    for(i=p
56a0: 2d 3e 69 46 69 72 73 74 3b 20 69 3c 3d 6e 50 61  ->iFirst; i<=nPa
56b0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
56c0: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e  PtrmapEntry *pEn
56d0: 74 72 79 20 3d 20 26 70 2d 3e 61 50 74 72 5b 69  try = &p->aPtr[i
56e0: 2d 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20  -p->iFirst];.   
56f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5700: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 0a  QLITE_CORRUPT, .
5710: 20 20 20 20 20 20 20 20 20 20 22 62 74 72 65 65            "btree
5720: 50 74 72 6d 61 70 43 68 65 63 6b 3a 20 70 67 6e  PtrmapCheck: pgn
5730: 6f 3d 25 64 20 65 54 79 70 65 3d 25 64 20 70 61  o=%d eType=%d pa
5740: 72 65 6e 74 3d 25 64 22 2c 20 0a 20 20 20 20 20  rent=%d", .     
5750: 20 20 20 20 20 28 69 6e 74 29 69 2c 20 28 69 6e       (int)i, (in
5760: 74 29 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c  t)pEntry->eType,
5770: 20 28 69 6e 74 29 70 45 6e 74 72 79 2d 3e 70 61   (int)pEntry->pa
5780: 72 65 6e 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  rent.      );.  
5790: 20 20 7d 0a 20 20 20 20 61 62 6f 72 74 28 29 3b    }.    abort();
57a0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 20 20 2f  .  }.}..#else  /
57b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
57c0: 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 23 20 64 65  NCURRENT */.# de
57d0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
57e0: 41 6c 6c 6f 63 61 74 65 28 78 29 20 53 51 4c 49  Allocate(x) SQLI
57f0: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62  TE_OK.# define b
5800: 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65  treePtrmapDelete
5810: 28 78 29 20 0a 23 20 64 65 66 69 6e 65 20 62 74  (x) .# define bt
5820: 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 78  reePtrmapBegin(x
5830: 2c 79 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  ,y)  SQLITE_OK.#
5840: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5850: 6d 61 70 45 6e 64 28 78 2c 79 2c 7a 29 20 0a 23  mapEnd(x,y,z) .#
5860: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5870: 6d 61 70 43 68 65 63 6b 28 79 2c 7a 29 20 0a 23  mapCheck(y,z) .#
5880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5890: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20  OMIT_CONCURRENT 
58a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
58b0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
58c0: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
58d0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
58e0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
58f0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
5900: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5910: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
5920: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5930: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5940: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
5950: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
5960: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5970: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
5980: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5990: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
59a0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
59b0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
59c0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
59d0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
59e0: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
59f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5a00: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5a10: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
5a20: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
5a30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5a40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
5a50: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
5a60: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
5a70: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
5a80: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
5a90: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
5aa0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
5ab0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
5ac0: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
5ad0: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
5ae0: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
5af0: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
5b00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
5b10: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
5b20: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
5b30: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
5b40: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
5b50: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
5b60: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
5b70: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
5b80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
5b90: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
5ba0: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
5bb0: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
5bc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5bd0: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
5be0: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
5bf0: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
5c00: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
5c10: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
5c20: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
5c30: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
5c40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5c50: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
5c60: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
5c70: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
5c80: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
5c90: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
5ca0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5cb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
5cc0: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
5cd0: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
5ce0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5cf0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5d00: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
5d10: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
5d20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
5d30: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
5d40: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
5d50: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
5d60: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
5d70: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5d80: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
5d90: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
5da0: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
5db0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
5dc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
5dd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
5de0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
5df0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
5e00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5e10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
5e20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
5e30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
5e40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
5e50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5e70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5e80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5e90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
5ea0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
5eb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
5ec0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
5ed0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
5ee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
5ef0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
5f00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
5f10: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
5f20: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
5f30: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
5f40: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
5f50: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
5f60: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
5f70: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
5f80: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
5f90: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
5fa0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
5fb0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
5fc0: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
5fd0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
5fe0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
5ff0: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
6000: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
6010: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
6020: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
6030: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
6040: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
6050: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
6060: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
6070: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
6080: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
6090: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
60a0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
60b0: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
60c0: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
60d0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
60e0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
60f0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
6100: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
6110: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
6120: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
6130: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
6140: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
6150: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6160: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
6170: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
6180: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
6190: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
61a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
61b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
61c0: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
61d0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
61e0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
61f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6200: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
6210: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
6220: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
6230: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
6240: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
6250: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
6260: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
6270: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
6280: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
6290: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
62a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
62b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
62c0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
62d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
62e0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
62f0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
6300: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
6310: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
6320: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
6330: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
6340: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
6350: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
6360: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
6370: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
6380: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
6390: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
63a0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
63b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
63c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
63d0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
63e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
63f0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
6400: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
6410: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
6420: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
6430: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6440: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
6450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6460: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
6470: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
6480: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
6490: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
64a0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
64b0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
64c0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
64d0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
64e0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
64f0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
6500: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
6510: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6520: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
6530: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
6540: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
6550: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
6560: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
6570: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
6580: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
6590: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
65a0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
65b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
65c0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
65d0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
65e0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
65f0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
6600: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6610: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
6620: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
6630: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
6640: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
6650: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
6660: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
6670: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
6680: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
6690: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
66a0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
66b0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
66c0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
66d0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
66e0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
66f0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
6700: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
6710: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
6720: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
6730: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
6740: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
6750: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
6760: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
6770: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
6780: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
6790: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
67a0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
67b0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
67c0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
67d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
67e0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
67f0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
6800: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
6810: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
6820: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
6830: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
6840: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
6850: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
6860: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
6870: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
6880: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
6890: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
68a0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
68b0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
68c0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
68d0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
68e0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
68f0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
6900: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
6910: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
6920: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
6930: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
6940: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
6950: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
6960: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
6970: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
6980: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
6990: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
69a0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
69b0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
69c0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
69d0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
69e0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
69f0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6a00: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
6a10: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
6a20: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
6a30: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
6a40: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
6a50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
6a60: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
6a70: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
6a80: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
6a90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6aa0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
6ab0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
6ac0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
6ad0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
6ae0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
6af0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
6b00: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
6b10: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
6b20: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
6b30: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
6b40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
6b50: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6b70: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
6b80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b90: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
6ba0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6bb0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
6bc0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
6bd0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
6be0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
6bf0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
6c00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
6c10: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
6c20: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
6c30: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
6c40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6c50: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
6c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
6c90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
6ca0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
6cc0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
6cd0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
6ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
6d00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
6d10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
6d20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
6d30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6d40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
6d50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
6d60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
6d70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
6d80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
6d90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
6da0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
6db0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
6dc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
6dd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
6de0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
6df0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
6e00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6e10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
6e20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
6e30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
6e40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
6e50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
6e60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
6e70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
6e80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
6e90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
6ea0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
6eb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
6ec0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
6ed0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6ee0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
6ef0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
6f00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
6f10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
6f20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
6f30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
6f40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
6f50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
6f60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
6f70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
6f80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
6f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
6fb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
6fc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
6fd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
6fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
6ff0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
7000: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
7010: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
7020: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
7030: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
7040: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
7050: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
7060: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
7070: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
7080: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
7090: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
70a0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
70b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
70c0: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
70d0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
70e0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
70f0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
7100: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
7110: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
7120: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7130: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
7140: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
7150: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
7160: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
7170: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
7180: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
7190: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
71a0: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
71b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
71c0: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
71d0: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
71e0: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
71f0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
7200: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
7210: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
7220: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
7230: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
7240: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
7250: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
7260: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
7270: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
7280: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
7290: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
72a0: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
72b0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
72c0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
72d0: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
72e0: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
72f0: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
7300: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
7310: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
7320: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
7330: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
7340: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7350: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7360: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
7370: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
7380: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
7390: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
73a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
73b0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
73c0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
73d0: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
73e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
73f0: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
7400: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
7410: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
7420: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
7440: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
7450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
7460: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
7470: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
7480: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
7490: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
74a0: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
74b0: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
74c0: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
74d0: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
74e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
74f0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
7500: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
7510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
7520: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
7530: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
7540: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
7550: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7560: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
7570: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
7580: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
75a0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
75b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
75c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
75d0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
75e0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
75f0: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
7600: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
7610: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
7620: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
7630: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
7640: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
7650: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
7660: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
7670: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
7680: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
7690: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
76a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
76b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
76c0: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
76d0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
76e0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
76f0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7700: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
7710: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
7720: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
7730: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
7740: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7750: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7760: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
7770: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
7780: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
7790: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
77a0: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
77b0: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
77c0: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
77d0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
77e0: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
77f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
7800: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
7810: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
7820: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
7830: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
7840: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
7850: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
7860: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
7870: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
7880: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7890: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
78a0: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
78b0: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
78c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
78d0: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
78e0: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
78f0: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
7900: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
7910: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
7920: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7930: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
7940: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
7950: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
7960: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
7970: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
7980: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
7990: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
79a0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
79b0: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
79c0: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
79d0: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
79e0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
79f0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
7a00: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
7a10: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
7a20: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
7a30: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
7a40: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
7a50: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
7a60: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
7a70: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
7a80: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
7a90: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
7aa0: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
7ab0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
7ac0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
7ad0: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
7ae0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
7af0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
7b00: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
7b10: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
7b20: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
7b30: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
7b40: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
7b50: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
7b60: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
7b70: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
7b80: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
7b90: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
7ba0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
7bb0: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
7bc0: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
7bd0: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
7be0: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
7bf0: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
7c00: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
7c10: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
7c20: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
7c30: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
7c40: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
7c50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
7c60: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
7c70: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
7c80: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
7c90: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
7ca0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
7cb0: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
7cc0: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
7cd0: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
7ce0: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
7cf0: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
7d00: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
7d10: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
7d20: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
7d30: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
7d40: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
7d50: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
7d60: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
7d70: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
7d80: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
7d90: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
7da0: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
7db0: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
7dc0: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
7dd0: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
7de0: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
7df0: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
7e00: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
7e10: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
7e20: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
7e30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7e40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
7e50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
7e60: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
7e70: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
7e80: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
7e90: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
7ea0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
7eb0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
7ec0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
7ed0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
7ee0: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
7ef0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
7f00: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
7f10: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
7f20: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
7f30: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
7f40: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
7f50: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
7f60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7f70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
7f80: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
7f90: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
7fa0: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
7fb0: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
7fc0: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
7fd0: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
7fe0: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
7ff0: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
8000: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
8010: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
8020: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
8030: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
8040: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
8050: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
8060: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
8070: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
8080: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
8090: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
80a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
80b0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
80c0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
80d0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
80f0: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
8100: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
8110: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
8120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
8130: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
8140: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
8150: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
8160: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
8170: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
8180: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
8190: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
81a0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
81b0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
81c0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
81d0: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
81e0: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
81f0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
8200: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
8210: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
8220: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
8230: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
8240: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
8250: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
8260: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
8270: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
8280: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8290: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
82a0: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
82b0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
82c0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
82d0: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
82e0: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
82f0: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
8300: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
8310: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8320: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
8330: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
8340: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
8350: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
8360: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
8370: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
8380: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
8390: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
83a0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
83b0: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
83c0: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
83d0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
83e0: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
83f0: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
8400: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
8410: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
8420: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
8430: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
8440: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
8450: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
8460: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
8470: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
8480: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
8490: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
84a0: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
84b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
84c0: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
84d0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
84e0: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
84f0: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
8500: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
8510: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
8520: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
8530: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
8540: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
8550: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
8560: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
8570: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
8580: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
8590: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
85a0: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
85b0: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
85c0: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
85d0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
85e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
85f0: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
8600: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
8610: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
8620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
8630: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
8640: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
8650: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
8660: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
8670: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
8680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
8690: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
86a0: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
86b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
86c0: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
86d0: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
86e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
86f0: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
8700: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
8710: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8720: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
8730: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
8740: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
8750: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
8760: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
8770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
8780: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
8790: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
87a0: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
87b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
87c0: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
87d0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
87e0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
87f0: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
8800: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
8810: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
8820: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
8830: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
8840: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
8850: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
8860: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
8870: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8880: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
8890: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
88a0: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
88b0: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
88c0: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
88d0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
88e0: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
88f0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
8900: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
8910: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
8920: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
8930: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
8940: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
8950: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
8960: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
8970: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
8980: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
8990: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
89a0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
89b0: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
89c0: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
89d0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
89e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
89f0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
8a00: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
8a10: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
8a20: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
8a30: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
8a40: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
8a50: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
8a60: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
8a70: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
8a80: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
8a90: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
8aa0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
8ab0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
8ac0: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
8ad0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
8ae0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
8af0: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
8b00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8b10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
8b20: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
8b30: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
8b40: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
8b50: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
8b60: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
8b70: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
8b80: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
8b90: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
8ba0: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
8bb0: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
8bc0: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
8bd0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
8be0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
8bf0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
8c00: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
8c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8c20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
8c30: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
8c40: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
8c50: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
8c60: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
8c70: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
8c80: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
8c90: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
8ca0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
8cb0: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
8cc0: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
8cd0: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
8ce0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
8cf0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
8d00: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
8d10: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
8d20: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
8d30: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
8d40: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
8d50: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
8d60: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
8d70: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
8d80: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
8d90: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
8da0: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
8db0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
8dc0: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
8dd0: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
8de0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
8df0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
8e00: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
8e10: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
8e20: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
8e30: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
8e40: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
8e50: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
8e60: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
8e70: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
8e80: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
8e90: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
8ea0: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
8eb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
8ec0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
8ed0: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
8ee0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
8ef0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
8f00: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
8f10: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
8f20: 72 20 74 6f 20 61 20 66 61 6b 65 20 42 74 43 75  r to a fake BtCu
8f30: 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 68 61 74  rsor object that
8f40: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73   will always ans
8f50: 77 65 72 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20  wer.** false to 
8f60: 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
8f70: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
8f80: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 20   routine above. 
8f90: 20 54 68 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72   The fake.** cur
8fa0: 73 6f 72 20 72 65 74 75 72 6e 65 64 20 6d 75 73  sor returned mus
8fb0: 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  t not be used wi
8fc0: 74 68 20 61 6e 79 20 6f 74 68 65 72 20 42 74 72  th any other Btr
8fd0: 65 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ee interface..*/
8fe0: 0a 42 74 43 75 72 73 6f 72 20 2a 73 71 6c 69 74  .BtCursor *sqlit
8ff0: 65 33 42 74 72 65 65 46 61 6b 65 56 61 6c 69 64  e3BtreeFakeValid
9000: 43 75 72 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20  Cursor(void){.  
9010: 73 74 61 74 69 63 20 75 38 20 66 61 6b 65 43 75  static u8 fakeCu
9020: 72 73 6f 72 20 3d 20 43 55 52 53 4f 52 5f 56 41  rsor = CURSOR_VA
9030: 4c 49 44 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  LID;.  assert( o
9040: 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
9050: 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a  , eState)==0 );.
9060: 20 20 72 65 74 75 72 6e 20 28 42 74 43 75 72 73    return (BtCurs
9070: 6f 72 2a 29 26 66 61 6b 65 43 75 72 73 6f 72 3b  or*)&fakeCursor;
9080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9090: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
90a0: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
90b0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
90c0: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
90d0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
90e0: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
90f0: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
9100: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
9110: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
9120: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
9130: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
9140: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
9150: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
9160: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
9170: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
9180: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
9190: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
91a0: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
91b0: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
91c0: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
91d0: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
91e0: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
91f0: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
9200: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
9210: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
9220: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
9230: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
9240: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
9250: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
9260: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
9270: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
9280: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
9290: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
92a0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
92b0: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
92c0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
92d0: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
92e0: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
92f0: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
9300: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
9310: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
9320: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
9330: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
9340: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
9350: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
9360: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
9370: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
9380: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
9390: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
93a0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
93b0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
93c0: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
93d0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
93e0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
93f0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
9400: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
9410: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
9420: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
9430: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
9440: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
9450: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
9460: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
9470: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
9480: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
9490: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
94a0: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
94b0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
94c0: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
94d0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
94e0: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
94f0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
9500: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
9510: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
9520: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
9530: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
9540: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
9550: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
9560: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
9570: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
9580: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
9590: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
95a0: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
95b0: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
95c0: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
95d0: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
95e0: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
95f0: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
9600: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
9610: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
9620: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
9630: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
9640: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
9650: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
9660: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
9670: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
9680: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
9690: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
96a0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
96b0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
96c0: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
96d0: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
96e0: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
96f0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
9700: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
9710: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
9720: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
9730: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
9740: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
9750: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
9760: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
9770: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
9780: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
9790: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
97a0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
97b0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
97c0: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
97d0: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
97e0: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
97f0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
9800: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
9810: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
9820: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
9830: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
9840: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
9850: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
9860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9870: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
9880: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
9890: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
98a0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
98b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
98c0: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
98d0: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
98e0: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
98f0: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
9900: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
9910: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
9920: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
9930: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
9940: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
9950: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
9960: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
9970: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
9980: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
9990: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
99a0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
99b0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
99c0: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
99d0: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
99e0: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
99f0: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
9a00: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
9a10: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
9a20: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
9a30: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
9a40: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
9a50: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
9a60: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
9a70: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
9a80: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
9a90: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
9aa0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
9ab0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
9ac0: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
9ad0: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
9ae0: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
9af0: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
9b00: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
9b10: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
9b20: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
9b30: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
9b40: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
9b50: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
9b60: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
9b70: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
9b80: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
9b90: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
9ba0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
9bb0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
9bc0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
9bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
9be0: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
9bf0: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
9c00: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
9c10: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
9c20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9c30: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
9c40: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
9c50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
9c60: 20 6e 75 6d 62 65 72 20 69 73 20 6e 65 76 65 72   number is never
9c70: 20 61 64 64 65 64 20 74 6f 20 61 20 70 6f 69 6e   added to a poin
9c80: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter-map page */.
9c90: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
9ca0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
9cb0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
9cc0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 23 69 66 6e  E(pBt)) );..#ifn
9cd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9ce0: 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28  CONCURRENT.  if(
9cf0: 20 70 42 74 2d 3e 70 4d 61 70 20 29 7b 0a 20 20   pBt->pMap ){.  
9d00: 20 20 2a 70 52 43 20 3d 20 62 74 72 65 65 50 74    *pRC = btreePt
9d10: 72 6d 61 70 53 74 6f 72 65 28 70 42 74 2c 20 6b  rmapStore(pBt, k
9d20: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
9d30: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
9d40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
9d50: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
9d60: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
9d70: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
9d80: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
9d90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
9da0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
9db0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
9dc0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
9dd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9de0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
9df0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
9e00: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
9e10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9e20: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
9e30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
9e40: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
9e50: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
9e60: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
9e70: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
9e80: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
9e90: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9ea0: 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74  goto ptrmap_exit
9eb0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9ec0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
9ed0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
9ee0: 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20   );.  pPtrmap = 
9ef0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
9f00: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
9f10: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
9f20: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
9f30: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
9f40: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
9f50: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
9f60: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
9f70: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
9f80: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
9f90: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
9fa0: 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c    *pRC= rc = sql
9fb0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
9fc0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
9fd0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9fe0: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
9ff0: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
a000: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
a010: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
a020: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
a030: 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65   }.  }..ptrmap_e
a040: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61  xit:.  sqlite3Pa
a050: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
a060: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
a070: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
a080: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
a090: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a0a0: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
a0b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
a0c0: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
a0d0: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
a0e0: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
a0f0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
a100: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
a110: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
a120: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
a130: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
a140: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
a150: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
a160: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
a170: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
a180: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
a190: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
a1a0: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
a1b0: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
a1c0: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
a1d0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
a1e0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
a1f0: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
a200: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
a210: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
a220: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
a230: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
a240: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
a250: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
a260: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
a270: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
a280: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
a290: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a2a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
a2b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
a2c0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
a2d0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
a2e0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a2f0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
a300: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
a310: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
a320: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
a330: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a340: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
a350: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
a360: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
a370: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
a380: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
a390: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
a3a0: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
a3b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
a3c0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
a3d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a3e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a3f0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
a400: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
a410: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
a420: 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21   assert( pEType!
a430: 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20  =0 );.  *pEType 
a440: 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  = pPtrmap[offset
a450: 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29  ];.  if( pPgno )
a460: 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79   *pPgno = get4by
a470: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
a480: 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  et+1]);..  sqlit
a490: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
a4a0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45  Page);.  if( *pE
a4b0: 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70  Type<1 || *pETyp
a4c0: 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e>5 ) return SQL
a4d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
a4e0: 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65 74  (iPtrmap);.  ret
a4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a500: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
a510: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
a520: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
a530: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
a540: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
a550: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
a560: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
a570: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
a580: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
a590: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
a5a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
a5b0: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
a5c0: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
a5d0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
a5e0: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
a5f0: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
a600: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
a610: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
a620: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
a630: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
a640: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
a650: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
a660: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
a670: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
a680: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
a690: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
a6a0: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
a6b0: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
a6c0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
a6d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a6e0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
a6f0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
a700: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
a710: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
a720: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
a730: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
a740: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
a750: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
a760: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
a770: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
a780: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
a790: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
a7a0: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
a7b0: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
a7c0: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
a7d0: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
a7e0: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
a7f0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
a800: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
a810: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
a820: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
a830: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
a840: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
a850: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
a860: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
a870: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
a880: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
a890: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
a8a0: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
a8b0: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
a8c0: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
a8d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
a8e0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
a8f0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
a900: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a910: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
a920: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a930: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a940: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a950: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
a960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a970: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
a980: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
a990: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
a9a0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
a9b0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
a9c0: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
a9d0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
a9e0: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
a9f0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
aa00: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
aa10: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
aa20: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
aa30: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
aa40: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
aa50: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
aa60: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
aa70: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
aa80: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
aa90: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
aaa0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
aab0: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
aac0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
aad0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
aae0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
aaf0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
ab00: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
ab10: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
ab20: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
ab30: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
ab40: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
ab50: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
ab60: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
ab70: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
ab80: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
ab90: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
aba0: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
abb0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
abc0: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
abd0: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
abe0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
abf0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
ac00: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
ac10: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
ac20: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
ac30: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
ac40: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
ac50: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
ac60: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
ac70: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
ac80: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
ac90: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
aca0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
acb0: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
acc0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
acd0: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
ace0: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
acf0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
ad00: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
ad10: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
ad20: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
ad30: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
ad40: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
ad50: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
ad60: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
ad70: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
ad80: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
ad90: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
ada0: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
adb0: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
adc0: 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d   - pCell) + 4;.}
add0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
ade0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
adf0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
ae00: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
ae10: 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a  e.xParseCell().*
ae20: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
ae30: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
ae40: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
ae50: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
ae60: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
ae70: 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  *.** btreeParseC
ae80: 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20  ellPtr()        
ae90: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
aea0: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62   leaf nodes.** b
aeb0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50  treeParseCellNoP
aec0: 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74  ayload()  =>   t
aed0: 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72  able btree inter
aee0: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  nal nodes.** btr
aef0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
af00: 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64  dex()   =>   ind
af10: 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a  ex btree nodes.*
af20: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c  *.** There is al
af30: 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e  so a wrapper fun
af40: 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65  ction btreeParse
af50: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
af60: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d  s for.** all Mem
af70: 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74  Page types and t
af80: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
af90: 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78  he cell by index
afa0: 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20   rather than.** 
afb0: 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  by pointer..*/.s
afc0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
afd0: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
afe0: 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65  yload(.  MemPage
aff0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
b000: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
b010: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
b020: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
b030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
b040: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
b050: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
b060: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
b070: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
b080: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
b090: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  .){.  assert( sq
b0a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b0b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b0c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b0d0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
b0e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b0f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
b100: 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==4 );.#ifndef S
b110: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
b120: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b130: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
b140: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
b150: 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43   + getVarint(&pC
b160: 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70  ell[4], (u64*)&p
b170: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70  Info->nKey);.  p
b180: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
b190: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f   0;.  pInfo->nLo
b1a0: 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  cal = 0;.  pInfo
b1b0: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
b1c0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
b1d0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
b1e0: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
b1f0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
b200: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
b210: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
b220: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b240: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
b250: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
b260: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
b270: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
b280: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
b290: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
b2a0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
b2b0: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
b2c0: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
b2d0: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
b2e0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
b2f0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b300: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
b310: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b330: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
b340: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
b350: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b360: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b370: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b380: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
b390: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
b3a0: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
b3b0: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
b3c0: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
b3d0: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
b3e0: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
b3f0: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
b400: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
b410: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
b420: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
b430: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
b440: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
b450: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
b460: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
b470: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
b480: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
b490: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
b4a0: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
b4b0: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
b4c0: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
b4d0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
b4e0: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
b4f0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
b500: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
b510: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
b520: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
b530: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
b540: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
b550: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
b560: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
b570: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
b580: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
b590: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
b5a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
b5b0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
b5c0: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
b5d0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
b5e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
b5f0: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
b600: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
b610: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
b620: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
b630: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
b640: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
b650: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
b660: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
b670: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
b680: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
b690: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
b6a0: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
b6b0: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
b6c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
b6d0: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
b6e0: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
b6f0: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
b700: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
b710: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b720: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
b730: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
b740: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
b750: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
b760: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
b770: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
b780: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
b790: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
b7a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
b7b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
b7c0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
b7d0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
b7e0: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
b7f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
b800: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
b810: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
b820: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
b830: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
b840: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
b850: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
b860: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
b870: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
b880: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
b890: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
b8a0: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
b8b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
b8c0: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
b8d0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
b8e0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
b8f0: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
b900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
b910: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
b920: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
b930: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
b940: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
b950: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
b960: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
b970: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
b980: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
b990: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
b9a0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
b9b0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
b9c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
b9d0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
b9e0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
b9f0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
ba00: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
ba10: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
ba20: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
ba30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
ba40: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
ba50: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
ba60: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
ba70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ba80: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
ba90: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
baa0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
bab0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
bac0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
bad0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
bae0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
baf0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
bb00: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
bb10: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
bb20: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
bb30: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
bb40: 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
bb50: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
bb60: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
bb70: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
bb80: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
bb90: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
bba0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
bbb0: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
bbc0: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
bbd0: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
bbe0: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
bbf0: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
bc00: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
bc10: 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f  pIter++;.  pInfo
bc20: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
bc30: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  d;.  pInfo->nPay
bc40: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
bc50: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
bc60: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
bc70: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
bc80: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
bc90: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
bca0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
bcb0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
bcc0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
bcd0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
bce0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
bcf0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
bd00: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
bd10: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
bd20: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
bd30: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
bd40: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
bd50: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
bd60: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
bd70: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
bd80: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
bd90: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
bda0: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
bdb0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
bdc0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
bdd0: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
bde0: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
bdf0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
be00: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
be10: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
be20: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
be30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
be40: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
be50: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
be60: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
be70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
be80: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
be90: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
bea0: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
beb0: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
bec0: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
bed0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
bee0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
bef0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
bf00: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
bf10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
bf20: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
bf30: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
bf40: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
bf50: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
bf60: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
bf70: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
bf80: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
bf90: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
bfa0: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
bfb0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
bfc0: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
bfd0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
bfe0: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
bff0: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
c000: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
c010: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
c020: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
c030: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
c040: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
c050: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
c060: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
c070: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
c080: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
c090: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
c0a0: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
c0b0: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
c0c0: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
c0d0: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
c0e0: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
c0f0: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
c100: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
c110: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
c120: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
c130: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
c140: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
c150: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
c160: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
c170: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
c180: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
c190: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
c1c0: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
c1d0: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
c1e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
c210: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
c220: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c230: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
c240: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
c250: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
c260: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
c270: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
c280: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
c290: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
c2a0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
c2b0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
c2c0: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
c2d0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
c2e0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
c2f0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
c300: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
c310: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
c320: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
c330: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
c340: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
c350: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
c360: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
c370: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
c380: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
c390: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
c3a0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
c3b0: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
c3c0: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
c3d0: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
c3e0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
c3f0: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
c400: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
c410: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
c420: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
c430: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
c440: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
c450: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
c460: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
c470: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
c480: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
c490: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
c4a0: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
c4b0: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
c4c0: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
c4d0: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
c4e0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
c4f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
c500: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
c510: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
c520: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
c530: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
c540: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
c550: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
c560: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
c570: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
c580: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c590: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
c5a0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
c5b0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
c5c0: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
c5d0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
c5e0: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
c5f0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
c600: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
c610: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
c620: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
c630: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
c640: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
c650: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
c660: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
c670: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
c680: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
c690: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c6a0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
c6b0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
c6c0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
c6d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
c6e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
c6f0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
c700: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
c710: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
c720: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
c730: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
c740: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
c750: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
c760: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
c770: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
c780: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
c790: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
c7a0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
c7b0: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
c7c0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
c7d0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
c7e0: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
c7f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
c800: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
c810: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
c830: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
c840: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
c850: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
c860: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
c870: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
c880: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
c890: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
c8a0: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
c8b0: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
c8c0: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
c8d0: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
c8e0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
c8f0: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
c900: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
c910: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
c920: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
c930: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
c940: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
c950: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
c960: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
c970: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
c980: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
c990: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
c9a0: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
c9b0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
c9c0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
c9d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
c9e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
c9f0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
ca00: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
ca10: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
ca20: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
ca30: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
ca40: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
ca50: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
ca60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
ca70: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
ca80: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
ca90: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
caa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
cab0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
cac0: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
cad0: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
cae0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
caf0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
cb00: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
cb10: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
cb20: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
cb30: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
cb40: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
cb50: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
cb60: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
cb70: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
cb80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cb90: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
cba0: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
cbb0: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
cbc0: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
cbd0: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
cbe0: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
cbf0: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
cc00: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
cc10: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
cc20: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
cc30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
cc40: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
cc50: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
cc60: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
cc70: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
cc80: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
cc90: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
cca0: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
ccb0: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
ccc0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
ccd0: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
cce0: 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
ccf0: 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
cd00: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
cd10: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
cd20: 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29  l[info.nSize-4])
cd30: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
cd40: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
cd50: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
cd60: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
cd70: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
cd80: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
cd90: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
cda0: 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75 74  given. This rout
cdb0: 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73 20  ine reorganizes 
cdc0: 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  cells within the
cdd0: 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61 74  .** page so that
cde0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   there are no fr
cdf0: 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  ee-blocks on the
ce00: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74   free-block list
ce10: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
ce20: 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74 68  r nMaxFrag is th
ce30: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
ce40: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 73   of fragmented s
ce50: 70 61 63 65 20 74 68 61 74 20 6d 61 79 20 62 65  pace that may be
ce60: 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74  .** present in t
ce70: 68 65 20 70 61 67 65 20 61 66 74 65 72 20 74 68  he page after th
ce80: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
ce90: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e  ns..**.** EVIDEN
cea0: 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36  CE-OF: R-44582-6
ceb0: 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20  0138 SQLite may 
cec0: 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d  from time to tim
ced0: 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a  e reorganize a.*
cee0: 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f  * b-tree page so
cef0: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
cf00: 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72  no freeblocks or
cf10: 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c   fragment bytes,
cf20: 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62   all.** unused b
cf30: 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e  ytes are contain
cf40: 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f  ed in the unallo
cf50: 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69  cated space regi
cf60: 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63  on, and all.** c
cf70: 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20  ells are packed 
cf80: 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65  tightly at the e
cf90: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
cfa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
cfb0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
cfc0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
cfd0: 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69 6e   nMaxFrag){.  in
cfe0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
cff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
d000: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
d010: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
d020: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
d030: 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ess of the i-th 
d040: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
d050: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d060: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
d070: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
d080: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
d0b0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
d0c0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
d0d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d0e0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
d0f0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
d100: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
d110: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
d120: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
d130: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
d140: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
d150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d160: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
d170: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d180: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
d1b0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
d1c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d1d0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
d1e0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
d1f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d200: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
d210: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
d220: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
d230: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
d240: 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  *src;        /* 
d250: 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e  Source of conten
d260: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
d270: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
d280: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
d290: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
d2a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
d2b0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
d2c0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
d2d0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
d2e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d2f0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
d300: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
d310: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
d320: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
d330: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d340: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d350: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
d360: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
d370: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
d380: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
d390: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d3a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d3b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d3c0: 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72    temp = 0;.  sr
d3d0: 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65  c = data = pPage
d3e0: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
d3f0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d400: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
d410: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
d420: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
d430: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
d440: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
d450: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d460: 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46  +3]) );.  iCellF
d470: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
d480: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75  t + 2*nCell;.  u
d490: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
d4a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d4b0: 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  ze;..  /* This b
d4c0: 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61 67  lock handles pag
d4d0: 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 66  es with two or f
d4e0: 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b 73  ewer free blocks
d4f0: 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20 20   and nMaxFrag.  
d500: 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61 67  ** or fewer frag
d510: 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49 6e  mented bytes. In
d520: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
d530: 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65 20   faster to move 
d540: 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72  the.  ** two (or
d550: 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20   one) blocks of 
d560: 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d  cells using memm
d570: 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20 74 68  ove() and add th
d580: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
d590: 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63 68 20  offsets to each 
d5a0: 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
d5b0: 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
d5c0: 79 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20  y than it is to 
d5d0: 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63  .  ** reconstruc
d5e0: 74 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  t the entire pag
d5f0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e  e.  */.  if( (in
d600: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e  t)data[hdr+7]<=n
d610: 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20 69  MaxFrag ){.    i
d620: 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74 32 62  nt iFree = get2b
d630: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
d640: 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  );.    if( iFree
d650: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46   ){.      int iF
d660: 72 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28  ree2 = get2byte(
d670: 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 0a  &data[iFree]);..
d680: 20 20 20 20 20 20 2f 2a 20 70 61 67 65 46 69 6e        /* pageFin
d690: 64 53 6c 6f 74 28 29 20 68 61 73 20 61 6c 72 65  dSlot() has alre
d6a0: 61 64 79 20 76 65 72 69 66 69 65 64 20 74 68 61  ady verified tha
d6b0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 72  t free blocks ar
d6c0: 65 20 73 6f 72 74 65 64 0a 20 20 20 20 20 20 2a  e sorted.      *
d6d0: 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 6f 66  * in order of of
d6e0: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
d6f0: 70 61 67 65 2c 20 61 6e 64 20 74 68 61 74 20 6e  page, and that n
d700: 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 0a  o block extends.
d710: 20 20 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68        ** past th
d720: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d730: 65 2e 20 50 72 6f 76 69 64 65 64 20 74 68 65 20  e. Provided the 
d740: 74 77 6f 20 66 72 65 65 20 73 6c 6f 74 73 20 64  two free slots d
d750: 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20  o not .      ** 
d760: 6f 76 65 72 6c 61 70 2c 20 74 68 69 73 20 67 75  overlap, this gu
d770: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
d780: 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61 6c 6c  e memmove() call
d790: 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  s below will not
d7a0: 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  .      ** overwr
d7b0: 69 74 65 20 74 68 65 20 75 73 61 62 6c 65 53 69  ite the usableSi
d7c0: 7a 65 20 62 79 74 65 20 62 75 66 66 65 72 2c 20  ze byte buffer, 
d7d0: 65 76 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  even if the data
d7e0: 62 61 73 65 20 70 61 67 65 0a 20 20 20 20 20 20  base page.      
d7f0: 2a 2a 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  ** is corrupt.  
d800: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
d810: 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46   iFree2==0 || iF
d820: 72 65 65 32 3e 69 46 72 65 65 20 29 3b 0a 20 20  ree2>iFree );.  
d830: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
d840: 65 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  e+get2byte(&data
d850: 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20 75 73  [iFree+2]) <= us
d860: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
d870: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32    assert( iFree2
d880: 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b 67 65  ==0 || iFree2+ge
d890: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
d8a0: 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c  ee2+2]) <= usabl
d8b0: 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 20 20  eSize );..      
d8c0: 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20 7c 7c  if( 0==iFree2 ||
d8d0: 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d 3d 3d   (data[iFree2]==
d8e0: 30 20 26 26 20 64 61 74 61 5b 69 46 72 65 65 32  0 && data[iFree2
d8f0: 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  +1]==0) ){.     
d900: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 64     u8 *pEnd = &d
d910: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
d920: 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20   nCell*2];.     
d930: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a 20 20     u8 *pAddr;.  
d940: 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20 3d 20        int sz2 = 
d950: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  0;.        int s
d960: 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  z = get2byte(&da
d970: 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a 20 20  ta[iFree+2]);.  
d980: 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20 3d 20        int top = 
d990: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d9a0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20  dr+5]);.        
d9b0: 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65 20 29  if( top>=iFree )
d9c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
d9d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d9e0: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
d9f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
da00: 20 69 66 28 20 69 46 72 65 65 32 20 29 7b 0a 20   if( iFree2 ){. 
da10: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
da20: 20 69 46 72 65 65 2b 73 7a 3c 3d 69 46 72 65 65   iFree+sz<=iFree
da30: 32 20 29 3b 20 2f 2a 20 56 65 72 69 66 69 65 64  2 ); /* Verified
da40: 20 62 79 20 70 61 67 65 46 69 6e 64 53 6c 6f 74   by pageFindSlot
da50: 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  () */.          
da60: 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  sz2 = get2byte(&
da70: 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b  data[iFree2+2]);
da80: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
da90: 74 28 20 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b  t( iFree+sz+sz2+
daa0: 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a  iFree2-(iFree+sz
dab0: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
dac0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
dad0: 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65  move(&data[iFree
dae0: 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b  +sz+sz2], &data[
daf0: 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65  iFree+sz], iFree
db00: 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20  2-(iFree+sz));. 
db10: 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73           sz += s
db20: 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z2;.        }.  
db30: 20 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70        cbrk = top
db40: 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73  +sz;.        ass
db50: 65 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65  ert( cbrk+(iFree
db60: 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53  -top) <= usableS
db70: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ize );.        m
db80: 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72  emmove(&data[cbr
db90: 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20  k], &data[top], 
dba0: 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20  iFree-top);.    
dbb0: 20 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64      for(pAddr=&d
dbc0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
dbd0: 20 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64   pAddr<pEnd; pAd
dbe0: 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20  dr+=2){.        
dbf0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
dc00: 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  pAddr);.        
dc10: 20 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29    if( pc<iFree )
dc20: 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72  { put2byte(pAddr
dc30: 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20  , pc+sz); }.    
dc40: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70        else if( p
dc50: 63 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32  c<iFree2 ){ put2
dc60: 62 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73  byte(pAddr, pc+s
dc70: 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  z2); }.        }
dc80: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
dc90: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20  fragment_out;.  
dca0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dcb0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
dcc0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Size;.  iCellLas
dcd0: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
dce0: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
dcf0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
dd00: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
dd10: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
dd20: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
dd30: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
dd40: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
dd50: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
dd60: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
dd70: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
dd80: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
dd90: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
dda0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f  ellLast );.    /
ddb0: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
ddc0: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
ddd0: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
dde0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
ddf0: 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d  .    ** if PRAGM
de00: 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63  A cell_size_chec
de10: 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  k=ON..    */.   
de20: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
de30: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
de40: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
de50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
de60: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
de70: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
de80: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
de90: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
dea0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70   );.    size = p
deb0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
dec0: 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29  pPage, &src[pc])
ded0: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
dee0: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
def0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
df00: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
df10: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
df20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
df30: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
df40: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
df50: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
df60: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
df70: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
df80: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
df90: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
dfa0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
dfb0: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
dfc0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74  eSize );.    put
dfd0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
dfe0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70  k);.    if( temp
dff0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
e000: 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62   x;.      if( cb
e010: 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75  rk==pc ) continu
e020: 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20  e;.      temp = 
e030: 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
e040: 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74  Space(pPage->pBt
e050: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
e060: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
e070: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
e080: 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b     memcpy(&temp[
e090: 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63  x], &data[x], (c
e0a0: 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a  brk+size) - x);.
e0b0: 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70        src = temp
e0c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
e0d0: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
e0e0: 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  &src[pc], size);
e0f0: 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b  .  }.  data[hdr+
e100: 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67  7] = 0;.. defrag
e110: 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ment_out:.  if( 
e120: 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b  data[hdr+7]+cbrk
e130: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
e140: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
e150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e160: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
e170: 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
e180: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
e190: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
e1a0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
e1b0: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
e1c0: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
e1d0: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65  hdr+2] = 0;.  me
e1e0: 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c  mset(&data[iCell
e1f0: 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d  First], 0, cbrk-
e200: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61  iCellFirst);.  a
e210: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e220: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e230: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e240: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e250: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e260: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
e270: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
e280: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
e290: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
e2a0: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
e2b0: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
e2c0: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
e2d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
e2e0: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
e2f0: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
e300: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
e310: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
e320: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
e330: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
e340: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
e350: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e360: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
e370: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
e380: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
e390: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
e3a0: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
e3b0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
e3c0: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
e3d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
e3e0: 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65  .** Slots on the
e3f0: 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20   free list that 
e400: 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e  are between 1 an
e410: 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72  d 3 bytes larger
e420: 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77   than nByte.** w
e430: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69  ill be ignored i
e440: 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74  f adding the ext
e450: 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20  ra space to the 
e460: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
e470: 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68  unt.** causes th
e480: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
e490: 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20  count to exceed 
e4a0: 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  60..*/.static u8
e4b0: 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d   *pageFindSlot(M
e4c0: 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  emPage *pPg, int
e4d0: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63   nByte, int *pRc
e4e0: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
e4f0: 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
e500: 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  set;.  u8 * cons
e510: 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
e520: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64  Data;.  int iAdd
e530: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
e540: 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
e550: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b  (&aData[iAddr]);
e560: 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20  .  int x;.  int 
e570: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
e580: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e590: 65 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  e;.  int size;  
e5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
e5b0: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
e5c0: 6f 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ot */..  assert(
e5d0: 20 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65   pc>0 );.  while
e5e0: 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a 65  ( pc<=usableSize
e5f0: 2d 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  -4 ){.    /* EVI
e600: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31  DENCE-OF: R-2271
e610: 30 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72  0-53328 The thir
e620: 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74  d and fourth byt
e630: 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a  es of each.    *
e640: 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d  * freeblock form
e650: 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e   a big-endian in
e660: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
e670: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
e680: 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  reeblock.    ** 
e690: 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64  in bytes, includ
e6a0: 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68  ing the 4-byte h
e6b0: 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69  eader. */.    si
e6c0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ze = get2byte(&a
e6d0: 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  Data[pc+2]);.   
e6e0: 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d   if( (x = size -
e6f0: 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20   nByte)>=0 ){.  
e700: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
e710: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
e720: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
e730: 20 20 20 20 69 66 28 20 73 69 7a 65 2b 70 63 20      if( size+pc 
e740: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
e750: 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53          *pRc = S
e760: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e770: 47 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  GE(pPg);.       
e780: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
e790: 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29   }else if( x<4 )
e7a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
e7b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39  DENCE-OF: R-1149
e7c0: 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c  8-58022 In a wel
e7d0: 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
e7e0: 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a  page, the total.
e7f0: 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
e800: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72  r of bytes in fr
e810: 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20  agments may not 
e820: 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20  exceed 60. */.  
e830: 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b        if( aData[
e840: 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75  hdr+7]>57 ) retu
e850: 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f  rn 0;..        /
e860: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
e870: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
e880: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
e890: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
e8a0: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
e8b0: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
e8c0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
e8d0: 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
e8e0: 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b  [iAddr], &aData[
e8f0: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
e900: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d   aData[hdr+7] +=
e910: 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65   (u8)x;.      }e
e920: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
e930: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
e940: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
e950: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
e960: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
e970: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
e980: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
e990: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
e9a0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
e9b0: 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
e9c0: 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  [pc+2], x);.    
e9d0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
e9e0: 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b   &aData[pc + x];
e9f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72  .    }.    iAddr
ea00: 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20   = pc;.    pc = 
ea10: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
ea20: 70 63 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 63  pc]);.    if( pc
ea30: 3c 69 41 64 64 72 2b 73 69 7a 65 20 29 20 62 72  <iAddr+size ) br
ea40: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
ea50: 63 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  c ){.    *pRc = 
ea60: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
ea70: 41 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  AGE(pPg);.  }.. 
ea80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ea90: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
eaa0: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
eab0: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
eac0: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
ead0: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
eae0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
eaf0: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
eb00: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
eb10: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
eb20: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
eb30: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
eb40: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
eb50: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
eb60: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
eb70: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
eb80: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
eb90: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
eba0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
ebb0: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
ebc0: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
ebd0: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
ebe0: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
ebf0: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
ec00: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
ec10: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
ec20: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
ec30: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
ec40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
ec50: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
ec60: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
ec70: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
ec80: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
ec90: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
eca0: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
ecb0: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
ecc0: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
ecd0: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
ece0: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
ecf0: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
ed00: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
ed10: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
ed20: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
ed30: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
ed40: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
ed50: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
ed60: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
ed70: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
ed80: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
ed90: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
eda0: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
edb0: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
edc0: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
edd0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
ede0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
edf0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
ee20: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
ee30: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ee40: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ee50: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
ee60: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
ee70: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
ee80: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
ee90: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
eea0: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
eeb0: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
eec0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
eed0: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
eee0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
eef0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ef00: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
ef10: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
ef20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ef30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ef40: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ef50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
ef60: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
ef70: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
ef80: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
ef90: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
efa0: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
efb0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
efc0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
efd0: 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29  t( nByte < (int)
efe0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
eff0: 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20  bleSize-8) );.. 
f000: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f010: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
f020: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
f030: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
f040: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
f050: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
f060: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
f070: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
f080: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f090: 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66  R-29356-02391 If
f0a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
f0b0: 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20  es a 65536-byte 
f0c0: 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61  page size.  ** a
f0d0: 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20  nd the reserved 
f0e0: 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74  space is zero (t
f0f0: 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66  he usual value f
f100: 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63  or reserved spac
f110: 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e).  ** then the
f120: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
f130: 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79  fset of an empty
f140: 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62   page wants to b
f150: 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f  e 65536..  ** Ho
f160: 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65  wever, that inte
f170: 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ger is too large
f180: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e   to be stored in
f190: 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   a 2-byte unsign
f1a0: 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  ed.  ** integer,
f1b0: 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30   so a value of 0
f1c0: 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20   is used in its 
f1d0: 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20  place. */.  top 
f1e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f1f0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
f200: 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50  rt( top<=(int)pP
f210: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
f220: 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65  Size ); /* Preve
f230: 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74  nt by getAndInit
f240: 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20  Page() */.  if( 
f250: 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69  gap>top ){.    i
f260: 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61  f( top==0 && pPa
f270: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
f280: 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20  ize==65536 ){.  
f290: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
f2a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f2c0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
f2d0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ge);.    }.  }..
f2e0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
f2f0: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
f300: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
f310: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
f320: 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ell pointer.  **
f330: 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66   array entry off
f340: 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20  set, and if the 
f350: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
f360: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
f370: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
f380: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
f390: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
f3a0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
f3b0: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
f3c0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
f3d0: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
f3e0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
f3f0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
f400: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
f410: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
f420: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
f430: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
f440: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
f450: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
f460: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
f470: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
f480: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
f490: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
f4a0: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
f4b0: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
f4c0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
f4d0: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
f4e0: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
f4f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
f500: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
f510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f520: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f530: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
f540: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
f550: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
f560: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
f570: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
f580: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
f590: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
f5a0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
f5b0: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
f5c0: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
f5d0: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
f5e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f5f0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
f600: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20  PT_DB );.    rc 
f610: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
f620: 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70  (pPage, MIN(4, p
f630: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32  Page->nFree - (2
f640: 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69  +nByte)));.    i
f650: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
f660: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
f670: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
f680: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
f690: 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42  assert( gap+2+nB
f6a0: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
f6b0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
f6c0: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
f6d0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
f6e0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
f6f0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
f700: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
f710: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
f720: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
f730: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
f740: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
f750: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
f760: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
f770: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
f780: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
f790: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
f7a0: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
f7b0: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
f7c0: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
f7d0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
f7e0: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
f7f0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
f800: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
f810: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
f820: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
f830: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
f840: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
f850: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
f860: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
f870: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
f880: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f890: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
f8a0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
f8b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
f8c0: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
f8d0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
f8e0: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
f8f0: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
f900: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
f910: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
f920: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
f930: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
f940: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
f950: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
f960: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
f970: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
f980: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
f990: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
f9a0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
f9b0: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
f9c0: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
f9d0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
f9e0: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
f9f0: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
fa00: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
fa10: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
fa20: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
fa30: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
fa40: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
fa50: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
fa60: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
fa70: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
fa80: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
fa90: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
faa0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
fab0: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
fac0: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
fad0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
fae0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
faf0: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
fb00: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
fb10: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
fb40: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
fb50: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
fb60: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
fb70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fb80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
fb90: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
fba0: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
fbb0: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
fbe0: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
fbf0: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
fc00: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
fc30: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
fc40: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
fc50: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
fc60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
fc70: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
fc80: 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b 20  ize */.  u16 x; 
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fcb0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
fcc0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
fcd0: 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53  .  u32 iEnd = iS
fce0: 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20  tart + iSize;   
fcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
fd00: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
fd10: 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f  iStart buffer */
fd20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
fd30: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
fd40: 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65  aData;   /* Page
fd50: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61   content */..  a
fd60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fd70: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
fd80: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
fd90: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
fda0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
fdb0: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
fdc0: 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61  B || iStart>=pPa
fdd0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
fde0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
fdf0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
fe00: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
fe10: 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42  End <= pPage->pB
fe20: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
fe30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fe40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
fe50: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
fe60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
fe70: 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d  ize>=4 );   /* M
fe80: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
fe90: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
fea0: 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67 65  t( iStart<=pPage
feb0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
fec0: 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  e-4 );..  /* The
fed0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
fee0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
fef0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
ff00: 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20   Find the .  ** 
ff10: 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  spot on the list
ff20: 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68   where iStart sh
ff30: 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
ff40: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
ff50: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ff60: 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20  .  iPtr = hdr + 
ff70: 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50  1;.  if( data[iP
ff80: 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61  tr+1]==0 && data
ff90: 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iPtr]==0 ){.   
ffa0: 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20   iFreeBlk = 0;  
ffb0: 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
ffc0: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
ffd0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
ffe0: 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  pty */.  }else{.
fff0: 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65      while( (iFre
10000 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
10010 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53  &data[iPtr]))<iS
10020 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
10030 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
10040 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  4 ){.        if(
10050 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62   iFreeBlk==0 ) b
10060 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65  reak;.        re
10070 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10080 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
100a0 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a  Ptr = iFreeBlk;.
100b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46      }.    if( iF
100c0 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42  reeBlk>pPage->pB
100d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
100e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
100f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10100 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10110 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  }.    assert( iF
10120 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
10130 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
10140 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
10150 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
10160 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
10170 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
10180 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
10190 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
101a0 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
101b0 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
101c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72  a pointer to iFr
101d0 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20  eeBlk.    **.   
101e0 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
101f0 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f   if iFreeBlk sho
10200 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64  uld be coalesced
10210 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
10220 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a   iStart..    */.
10230 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
10240 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65   && iEnd+3>=iFre
10250 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46  eBlk ){.      nF
10260 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d  rag = iFreeBlk -
10270 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28   iEnd;.      if(
10280 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
10290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
102a0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
102b0 65 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  e);.      iEnd =
102c0 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
102d0 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
102e0 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
102f0 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
10300 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
10310 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10320 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10330 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 69       }.      iSi
10350 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61  ze = iEnd - iSta
10360 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42  rt;.      iFreeB
10370 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
10380 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a  ata[iFreeBlk]);.
10390 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
103a0 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68  If iPtr is anoth
103b0 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68  er freeblock (th
103c0 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69  at is, if iPtr i
103d0 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69  s not the freeli
103e0 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  st.    ** pointe
103f0 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  r in the page he
10400 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b  ader) then check
10410 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72   to see if iStar
10420 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  t should be.    
10430 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  ** coalesced ont
10440 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74  o the end of iPt
10450 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
10460 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a  ( iPtr>hdr+1 ){.
10470 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e        int iPtrEn
10480 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62  d = iPtr + get2b
10490 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32  yte(&data[iPtr+2
104a0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
104b0 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20  trEnd+3>=iStart 
104c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
104d0 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20  PtrEnd>iStart ) 
104e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
104f0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10500 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  );.        nFrag
10510 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
10520 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
10530 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
10540 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
10550 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
10560 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10570 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
10580 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
10590 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
105a0 50 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61 5b  Page);.    data[
105b0 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b  hdr+7] -= nFrag;
105c0 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32 62  .  }.  x = get2b
105d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
105e0 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 3c  );.  if( iStart<
105f0 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =x ){.    /* The
10600 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
10610 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
10620 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ng of the cell c
10630 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20  ontent area,.   
10640 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65   ** so just exte
10650 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
10660 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20  ent area rather 
10670 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74  than create anot
10680 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c  her.    ** freel
10690 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ist entry */.   
106a0 20 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c 7c   if( iStart<x ||
106b0 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
106c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
106d0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
106e0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
106f0 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72  data[hdr+1], iFr
10700 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
10710 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
10720 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  ], iEnd);.  }els
10730 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  e{.    /* Insert
10740 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   the new freeblo
10750 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65  ck into the free
10760 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32  list */.    put2
10770 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
10780 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  , iStart);.  }. 
10790 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
107a0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
107b0 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20  FAST_SECURE ){. 
107c0 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
107d0 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
107e0 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
107f0 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
10800 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74  elete.    ** opt
10810 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
10820 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  /.    memset(&da
10830 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
10840 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75 74  Size);.  }.  put
10850 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
10860 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
10870 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10880 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a  [iStart+2], iSiz
10890 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
108a0 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b  ee += iOrigSize;
108b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
108c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
108d0 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
108e0 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
108f0 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
10900 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
10910 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
10920 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
10930 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
10940 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
10950 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
10960 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
10970 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
10980 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
10990 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
109a0 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
109b0 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
109c0 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
109d0 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
109e0 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
109f0 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
10a00 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
10a10 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
10a20 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
10a30 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
10a40 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
10a50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
10a60 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
10a70 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
10a80 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
10a90 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
10aa0 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
10ab0 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
10ac0 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
10ad0 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
10ae0 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
10af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10b00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10b10 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
10b20 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
10b30 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
10b40 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
10b50 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
10b60 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
10b70 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
10b80 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
10b90 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
10ba0 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65  e->leaf;.  pPage
10bb0 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
10bc0 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74  llSizePtr;.  pBt
10bd0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
10be0 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
10bf0 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
10c00 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
10c10 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10c20 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20  : R-07291-35328 
10c30 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78  A value of 5 (0x
10c40 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  05) means the pa
10c50 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  ge is an.    ** 
10c60 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62  interior table b
10c70 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
10c80 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
10c90 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
10ca0 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f  KEY)==5 );.    /
10cb0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10cc0 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76  -26900-09176 A v
10cd0 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64  alue of 13 (0x0d
10ce0 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
10cf0 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
10d00 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  f table b-tree p
10d10 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
10d20 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
10d30 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  A|PTF_INTKEY|PTF
10d40 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20  _LEAF)==13 );.  
10d50 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
10d60 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
10d70 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
10d80 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
10d90 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  eaf = 1;.      p
10da0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
10db0 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
10dc0 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lPtr;.    }else{
10dd0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
10de0 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
10df0 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c      pPage->xCell
10e00 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
10e10 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
10e20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
10e30 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
10e40 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
10e50 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
10e60 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
10e70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
10e80 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
10e90 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
10ea0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
10eb0 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
10ec0 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATA ){.    /* EV
10ed0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33  IDENCE-OF: R-433
10ee0 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65  16-37308 A value
10ef0 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61   of 2 (0x02) mea
10f00 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
10f10 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f  n.    ** interio
10f20 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  r index b-tree p
10f30 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
10f40 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
10f50 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20  A)==2 );.    /* 
10f60 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
10f70 39 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c  9615-42828 A val
10f80 75 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20  ue of 10 (0x0a) 
10f90 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
10fa0 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20  s a.    ** leaf 
10fb0 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
10fc0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
10fd0 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c  ( (PTF_ZERODATA|
10fe0 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b  PTF_LEAF)==10 );
10ff0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
11000 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
11010 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
11020 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  0;.    pPage->xP
11030 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
11040 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
11050 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  x;.    pPage->ma
11060 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
11070 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
11080 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
11090 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
110a0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
110b0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30  DENCE-OF: R-4760
110c0 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65  8-56469 Any othe
110d0 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  r value for the 
110e0 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
110f0 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   is.    ** an er
11100 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ror. */.    retu
11110 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11120 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
11130 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
11140 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
11150 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
11160 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
11170 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11180 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
11190 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
111a0 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
111b0 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
111c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
111d0 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
111e0 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
111f0 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
11200 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
11210 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
11220 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
11230 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
11240 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
11250 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
11260 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
11270 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
11280 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
11290 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
112a0 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
112b0 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
112c0 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
112d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
112e0 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
112f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
11300 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  {.  int pc;     
11310 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
11320 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
11330 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
11340 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 68  Data[] */.  u8 h
11350 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
11360 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
11370 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
11380 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ader */.  u8 *da
11390 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
113a0 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
113b0 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61  aData */.  BtSha
113c0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
113d0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
113e0 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
113f0 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
11400 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
11410 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
11420 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
11430 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
11440 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
11450 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
11460 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
11470 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
11480 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
11490 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
114a0 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
114b0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  page */.  int to
114c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
114d0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
114e0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
114f0 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  rea */.  int iCe
11500 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
11510 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
11520 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
11530 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74   offset */.  int
11540 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
11550 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
11560 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
11570 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
11580 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11590 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
115a0 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64  t( pPage->pBt->d
115b0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
115c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
115d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
115e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
115f0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
11600 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
11610 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
11620 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
11630 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
11640 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
11650 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
11660 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
11670 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
11680 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11690 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
116a0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
116b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d  ( pPage->isInit=
116c0 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70  =0 );..  pBt = p
116d0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68 64 72  Page->pBt;.  hdr
116e0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
116f0 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  set;.  data = pP
11700 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a  age->aData;.  /*
11710 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11720 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
11730 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
11740 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
11750 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d  ting.  ** the b-
11760 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20  tree page type. 
11770 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46  */.  if( decodeF
11780 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
11790 5b 68 64 72 5d 29 20 29 7b 0a 20 20 20 20 72 65  [hdr]) ){.    re
117a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
117b0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
117c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
117d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
117e0 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
117f0 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
11800 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
11810 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
11820 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
11830 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
11840 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  0;.  usableSize 
11850 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
11860 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  e;.  pPage->cell
11870 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
11880 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  set = hdr + 8 + 
11890 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
118a0 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ize;.  pPage->aD
118b0 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
118c0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
118d0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
118e0 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
118f0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
11900 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
11910 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
11920 65 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  e];.  /* EVIDENC
11930 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38  E-OF: R-58015-48
11940 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65  175 The two-byte
11950 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
11960 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a  et 5 designates.
11970 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
11980 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
11990 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
119a0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
119b0 6e 74 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69  nteger is.  ** i
119c0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35  nterpreted as 65
119d0 35 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  536. */.  top = 
119e0 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
119f0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
11a00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
11a10 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54   R-37002-32774 T
11a20 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
11a30 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20  ger at offset 3 
11a40 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e  gives the.  ** n
11a50 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
11a60 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
11a70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
11a80 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
11a90 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50  dr+3]);.  if( pP
11aa0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
11ab0 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  LL(pBt) ){.    /
11ac0 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
11ad0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
11ae0 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
11af0 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
11b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11b10 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
11b20 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74 65 73  Page);.  }.  tes
11b30 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
11b40 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
11b50 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  ) );.  /* EVIDEN
11b60 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35  CE-OF: R-24089-5
11b70 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63  7979 If a page c
11b80 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
11b90 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a   (which is only.
11ba0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
11bb0 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
11bc0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
11bd0 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
11be0 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66  then the.  ** of
11bf0 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
11c00 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
11c10 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
11c20 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
11c30 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72  .  ** bytes of r
11c40 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a  eserved space. *
11c50 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
11c60 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f  e->nCell>0 || to
11c70 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  p==usableSize ||
11c80 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a   CORRUPT_DB );..
11c90 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
11ca0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
11cb0 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f  ight cause us to
11cc0 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
11cd0 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  nd.  ** of page 
11ce0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
11cf0 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ell.  .  **.  **
11d00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
11d10 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65  lock of code che
11d20 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65  cks early to see
11d30 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e   if a cell exten
11d40 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68 65  ds.  ** past the
11d50 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
11d60 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
11d70 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
11d80 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65  T to be .  ** re
11d90 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
11da0 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46  s..  */.  iCellF
11db0 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
11dc0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
11dd0 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
11de0 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
11df0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d  ;.  if( pBt->db-
11e00 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
11e10 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
11e20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11e30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
11e40 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
11e50 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
11e60 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
11e70 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
11e80 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ell */..    if( 
11e90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
11ea0 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
11eb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
11ec0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
11ed0 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
11ee0 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
11ef0 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
11f00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11f10 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
11f20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11f30 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
11f40 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
11f50 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
11f60 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
11f70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
11f80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
11f90 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
11fa0 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 50   }.      sz = pP
11fb0 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
11fc0 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
11fd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11fe0 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53  ( pc+sz==usableS
11ff0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
12000 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
12010 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e ){.        ret
12020 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12030 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
12040 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12050 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
12060 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
12070 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f  ;.  }  ..  /* Co
12080 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
12090 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
120a0 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44  e page.  ** EVID
120b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38  ENCE-OF: R-23588
120c0 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62  -34450 The two-b
120d0 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
120e0 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68  ffset 1 gives th
120f0 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20  e.  ** start of 
12100 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
12110 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  ock on the page,
12120 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74   or is zero if t
12130 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
12140 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a   freeblocks. */.
12150 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
12160 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
12170 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
12180 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
12190 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
121a0 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
121b0 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20   space */.  if( 
121c0 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  pc>0 ){.    u32 
121d0 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
121e0 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
121f0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t ){.      /* EV
12200 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
12210 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
12220 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
12230 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
12240 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79  l.      ** alway
12250 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  s be at least on
12260 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68  e cell before th
12270 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
12280 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
12290 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
122a0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
122b0 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  ge); .    }.    
122c0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
122d0 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61    if( pc>iCellLa
122e0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
122f0 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74   Freeblock off t
12300 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
12310 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
12320 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12330 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
12340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
12350 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
12360 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
12370 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
12380 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
12390 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
123a0 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
123b0 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69   if( next<=pc+si
123c0 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  ze+3 ) break;.  
123d0 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
123e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78     }.    if( nex
123f0 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  t>0 ){.      /* 
12400 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e  Freeblock not in
12410 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
12420 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
12430 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
12440 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
12450 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69   }.    if( pc+si
12460 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ze>(unsigned int
12470 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  )usableSize ){. 
12480 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65       /* Last fre
12490 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70  eblock extends p
124a0 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a  ast page end */.
124b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
124c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
124d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
124e0 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
124f0 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
12500 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
12510 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
12520 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
12530 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
12540 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
12550 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
12560 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a  bytes within.  *
12570 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
12580 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
12590 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
125a0 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
125b0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  .  ** of the pag
125c0 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
125d0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
125e0 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
125f0 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20  lso.  ** serves 
12600 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
12610 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
12620 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
12630 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  ll-content.  ** 
12640 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
12650 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
12660 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
12670 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  the page..  */. 
12680 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
12690 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  eSize ){.    ret
126a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
126b0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
126c0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
126d0 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
126e0 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
126f0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
12700 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
12710 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12720 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
12730 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
12740 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
12750 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
12760 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
12770 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12780 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
12790 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
127a0 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
127b0 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
127c0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
127d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
127e0 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
127f0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
12800 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
12810 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
12820 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
12830 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
12840 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
12850 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
12860 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
12870 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
12880 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
12890 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
128a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
128b0 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
128c0 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
128d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
128e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
128f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
12900 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
12910 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12920 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
12930 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
12940 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
12950 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65  SECURE ){.    me
12960 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
12970 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
12980 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
12990 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
129a0 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
129b0 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61  st = hdr + ((fla
129c0 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
129d0 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d  ? 12 : 8);.  mem
129e0 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
129f0 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
12a00 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
12a10 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
12a20 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
12a30 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
12a40 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
12a50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
12a60 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
12a70 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
12a80 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  gs);.  pPage->ce
12a90 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
12aa0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
12ab0 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d  End = &data[pBt-
12ac0 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
12ad0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
12ae0 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a  = &data[first];.
12af0 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66    pPage->aDataOf
12b00 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  st = &data[pPage
12b10 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
12b20 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
12b30 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
12b40 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
12b50 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
12b60 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
12b70 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
12b80 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
12b90 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
12ba0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
12bb0 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
12bc0 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  it = 1;.}.../*.*
12bd0 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61  * Convert a DbPa
12be0 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
12bf0 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20   the pager into 
12c00 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62  a MemPage used b
12c10 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c  y.** the btree l
12c20 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
12c30 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
12c40 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50  geFromDbPage(DbP
12c50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67  age *pDbPage, Pg
12c60 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65  no pgno, BtShare
12c70 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
12c80 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d  ge *pPage = (Mem
12c90 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
12ca0 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
12cb0 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21  ge);.  if( pgno!
12cc0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a  =pPage->pgno ){.
12cd0 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
12ce0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
12cf0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
12d00 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50  .    pPage->pDbP
12d10 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
12d20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
12d30 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  pBt;.    pPage->
12d40 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
12d50 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
12d60 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  t = pgno==1 ? 10
12d70 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  0 : 0;.  }.  ass
12d80 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
12d90 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
12da0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
12db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
12dc0 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
12dd0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
12de0 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
12df0 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
12e00 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
12e10 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
12e20 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65  s if needed.  Se
12e30 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74  e also: btreeGet
12e40 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a  UnusedPage()..**
12e50 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52  .** If the PAGER
12e60 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66  _GET_NOCONTENT f
12e70 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
12e80 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
12e90 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75  not care.** abou
12ea0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
12eb0 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
12ec0 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
12ed0 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
12ee0 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
12ef0 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
12f00 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
12f10 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
12f20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
12f30 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
12f40 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
12f50 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
12f60 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
12f70 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
12f80 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
12f90 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
12fa0 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
12fb0 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
12fc0 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
12fd0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
12fe0 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
12ff0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
13000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
13010 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
13020 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
13030 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
13040 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
13050 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
13060 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
13070 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
13080 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
13090 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
130a0 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
130b0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
130c0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
130d0 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
130e0 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
130f0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
13100 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
13110 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f  gs==PAGER_GET_NO
13120 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73  CONTENT || flags
13130 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ==PAGER_GET_READ
13140 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74  ONLY );.  assert
13150 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13160 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13170 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13180 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
13190 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
131a0 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
131b0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
131c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
131d0 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
131e0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
131f0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
13200 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
13210 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13220 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67  * Retrieve a pag
13230 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
13240 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72   cache. If the r
13250 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
13260 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20   not.** already 
13270 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
13280 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  he return NULL. 
13290 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
132a0 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
132b0 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
132c0 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
132d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  ed..*/.static Me
132e0 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
132f0 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20  Lookup(BtShared 
13300 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
13310 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
13320 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
13330 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13340 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13350 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
13360 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
13370 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
13380 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
13390 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
133a0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
133b0 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
133c0 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  o, pBt);.  }.  r
133d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
133e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
133f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13400 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
13410 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
13420 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f   kind of.** erro
13430 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69  r, return ((unsi
13440 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f  gned int)-1)..*/
13450 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72  .static Pgno btr
13460 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68  eePagecount(BtSh
13470 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65  ared *pBt){.  re
13480 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b  turn pBt->nPage;
13490 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  .}.u32 sqlite3Bt
134a0 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65  reeLastPage(Btre
134b0 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
134c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
134d0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
134e0 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74  assert( ((p->pBt
134f0 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30  ->nPage)&0x80000
13500 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
13510 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
13520 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
13530 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
13540 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
13550 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
13560 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21  ..**.** If pCur!
13570 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
13580 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65   is being fetche
13590 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d  d as part of a m
135a0 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20  oveToChild().** 
135b0 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69  call.  Do additi
135c0 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
135d0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
135e0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
135f0 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74  * And if the fet
13600 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
13610 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
13620 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
13630 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
13640 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
13650 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
13660 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
13670 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
13680 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
13690 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
136a0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
136b0 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
136c0 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
136d0 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
136e0 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
136f0 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
13700 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
13710 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
13720 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
13730 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
13740 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
13750 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
13760 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
13790 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
137a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
137b0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
137c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
137d0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
137e0 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
137f0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
13800 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
13810 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
13820 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
13830 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
13840 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
13850 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
13860 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
13870 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
13880 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
13890 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
138a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
138b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
138c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
138d0 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
138e0 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
138f0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
13900 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75  | bReadOnly==pCu
13910 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
13920 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
13930 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69  ur==0 || pCur->i
13940 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28  Page>0 );..  if(
13950 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
13960 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
13970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
13980 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
13990 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
139a0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
139b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
139c0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
139d0 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
139e0 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
139f0 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
13a00 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
13a10 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
13a20 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  r;.  }.  *ppPage
13a30 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
13a40 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
13a50 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
13a60 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  ( (*ppPage)->isI
13a70 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74  nit==0 ){.    bt
13a80 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
13a90 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
13aa0 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20   pBt);.    rc = 
13ab0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  btreeInitPage(*p
13ac0 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
13ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13ae0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13af0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
13b00 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
13b10 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
13b20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
13b30 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
13b40 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
13b50 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
13b60 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
13b70 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
13b80 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ge) );..  /* If 
13b90 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c  obtaining a chil
13ba0 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72  d page for a cur
13bb0 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72  sor, we must ver
13bc0 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
13bd0 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74  e is.  ** compat
13be0 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f  ible with the ro
13bf0 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66  ot page. */.  if
13c00 28 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50  ( pCur && ((*ppP
13c10 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  age)->nCell<1 ||
13c20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b   (*ppPage)->intK
13c30 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey!=pCur->curInt
13c40 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  Key) ){.    rc =
13c50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13c60 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20  PGNO(pgno);.    
13c70 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
13c80 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67  age);.    goto g
13c90 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
13ca0 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ror;.  }.  retur
13cb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65  n SQLITE_OK;..ge
13cc0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
13cd0 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29  or:.  if( pCur )
13ce0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  {.    pCur->iPag
13cf0 65 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  e--;.    pCur->p
13d00 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
13d10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
13d20 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
13d30 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
13d40 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
13d50 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
13d60 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
13d70 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
13d80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
13d90 55 52 52 45 4e 54 0a 2f 2a 20 0a 2a 2a 20 53 65  URRENT./* .** Se
13da0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
13db0 68 65 20 4d 65 6d 50 61 67 65 2e 70 67 6e 6f 52  he MemPage.pgnoR
13dc0 6f 6f 74 20 76 61 72 69 61 62 6c 65 2c 20 69 66  oot variable, if
13dd0 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73   it exists..*/.s
13de0 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4d 65  tatic void setMe
13df0 6d 70 61 67 65 52 6f 6f 74 28 4d 65 6d 50 61 67  mpageRoot(MemPag
13e00 65 20 2a 70 50 67 2c 20 75 33 32 20 70 67 6e 6f  e *pPg, u32 pgno
13e10 52 6f 6f 74 29 7b 0a 20 20 70 50 67 2d 3e 70 67  Root){.  pPg->pg
13e20 6e 6f 52 6f 6f 74 20 3d 20 70 67 6e 6f 52 6f 6f  noRoot = pgnoRoo
13e30 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
13e40 69 6e 65 20 73 65 74 4d 65 6d 70 61 67 65 52 6f  ine setMempageRo
13e50 6f 74 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  ot(x,y).#endif..
13e60 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
13e70 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
13e80 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
13e90 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
13ea0 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
13eb0 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a  treeGetPage..**.
13ec0 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20 73 70  ** Page1 is a sp
13ed0 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64 20 6d  ecial case and m
13ee0 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64 20  ust be released 
13ef0 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50 61 67  using releasePag
13f00 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  eOne()..*/.stati
13f10 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
13f20 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67  geNotNull(MemPag
13f30 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73  e *pPage){.  ass
13f40 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
13f50 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
13f60 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
13f70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
13f80 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
13f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13fa0 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
13fb0 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
13fc0 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
13fd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13fe0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
13ff0 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
14000 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
14010 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14020 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
14030 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
14040 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
14050 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
14060 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74  ->pDbPage);.}.st
14070 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
14080 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
14090 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
140a0 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65  ge ) releasePage
140b0 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a  NotNull(pPage);.
140c0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
140d0 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d  leasePageOne(Mem
140e0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
140f0 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30  assert( pPage!=0
14100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
14110 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
14120 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
14130 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
14140 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d  pPage->pDbPage!=
14150 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
14160 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
14170 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
14180 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
14190 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
141a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
141b0 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
141c0 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
141d0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
141e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
141f0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
14200 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
14210 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65  e3PagerUnrefPage
14220 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  One(pPage->pDbPa
14230 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge);.}../*.** Ge
14240 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65  t an unused page
14250 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ..**.** This wor
14260 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72  ks just like btr
14270 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68  eeGetPage() with
14280 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a   the addition:.*
14290 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65  *.**   *  If the
142a0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
142b0 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65   in use for some
142c0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20   other purpose, 
142d0 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
142e0 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61      release it a
142f0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
14300 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f  ITE_CURRUPT erro
14310 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20  r..**   *  Make 
14320 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20  sure the isInit 
14330 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f  flag is clear.*/
14340 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
14350 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a  eGetUnusedPage(.
14360 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
14370 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
14380 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
14390 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
143a0 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
143b0 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
143c0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
143d0 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
143e0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
143f0 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
14400 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
14410 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
14420 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
14430 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
14440 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
14450 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
14460 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
14470 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
14480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14490 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
144a0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
144b0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
144c0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
144d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
144e0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
144f0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
14500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14510 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14520 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
14530 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
14540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
14550 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
14560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
14570 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
14580 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
14590 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
145a0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
145b0 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
145c0 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
145d0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
145e0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
145f0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
14600 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
14610 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
14620 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
14630 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
14640 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
14650 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
14660 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
14670 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
14680 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
14690 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
146a0 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
146b0 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
146c0 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
146d0 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
146e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
146f0 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
14700 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
14710 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
14720 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
14730 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
14740 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
14750 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
14760 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
14770 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14780 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
14790 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
147a0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
147b0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
147c0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
147d0 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
147e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
147f0 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
14800 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
14810 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
14820 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
14830 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
14840 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
14850 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
14860 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
14870 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
14880 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
14890 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
148a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
148b0 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
148c0 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
148d0 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
148e0 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
148f0 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
14900 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
14910 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
14920 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
14930 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
14940 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
14950 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
14960 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
14970 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
14980 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
14990 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
149a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
149b0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
149c0 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
149d0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
149e0 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
149f0 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
14a00 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
14a10 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
14a20 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
14a30 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
14a40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14a50 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14a60 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
14a70 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
14a80 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
14a90 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
14aa0 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
14ab0 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
14ac0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
14ad0 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
14ae0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
14af0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
14b00 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
14b10 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
14b20 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
14b30 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
14b40 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
14b50 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
14b60 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
14b70 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
14b80 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
14b90 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
14ba0 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
14bb0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
14bc0 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
14bd0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
14be0 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
14bf0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
14c00 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
14c10 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
14c20 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
14c30 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
14c40 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
14c50 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
14c60 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
14c70 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
14c80 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
14c90 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
14ca0 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
14cb0 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
14cc0 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
14cd0 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
14ce0 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
14cf0 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
14d00 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
14d10 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
14d20 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
14d30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14d40 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
14d50 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
14d60 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
14d70 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
14d80 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
14d90 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
14da0 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
14db0 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
14dc0 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
14dd0 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
14de0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14df0 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
14e00 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
14e10 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
14e20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
14e30 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
14e40 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
14e50 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
14e60 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
14e70 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
14e80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
14e90 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
14ea0 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
14eb0 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
14ec0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
14ed0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
14ee0 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
14ef0 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
14f00 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
14f10 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
14f20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
14f30 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
14f40 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
14f50 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
14f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
14f70 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
14f80 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
14f90 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
14fa0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
14fb0 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
14fc0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
14fd0 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
14fe0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
14ff0 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
15000 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
15010 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15030 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
15040 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
15050 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
15060 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
15070 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
15080 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
15090 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
150a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
150b0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
150c0 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
150d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
150e0 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
150f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
15100 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
15110 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
15120 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
15130 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
15140 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
15150 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
15160 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
15170 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
15180 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
15190 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
151a0 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
151b0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
151c0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
151d0 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
151e0 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
151f0 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
15200 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
15210 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
15220 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
15230 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
15240 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
15250 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
15260 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
15270 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
15280 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
15290 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
152a0 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
152b0 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
152c0 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
152e0 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
152f0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
15300 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
15320 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
15330 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
15340 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
15350 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
15360 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
15370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
15380 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15390 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
153a0 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
153b0 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
153c0 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
153d0 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
153e0 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
153f0 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
15400 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
15410 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
15420 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
15430 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
15440 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
15450 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
15460 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
15470 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
15480 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
15490 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
154a0 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
154b0 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
154c0 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
154d0 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
154e0 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
154f0 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
15500 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
15510 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
15520 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
15530 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
15540 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
15550 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
15560 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
15570 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
15580 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
15590 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
155a0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
155b0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
155c0 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
155d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
155e0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
155f0 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
15600 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
15610 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
15620 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15630 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
15640 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
15650 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
15660 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
15670 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
15680 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
15690 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
156a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
156b0 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
156c0 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
156d0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
156e0 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
156f0 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
15700 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
15710 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
15720 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
15730 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
15740 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
15750 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
15760 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
15770 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
15780 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
15790 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
157a0 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
157b0 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
157c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
157d0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
157e0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
157f0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
15800 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
15810 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
15820 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
15830 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
15840 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
15850 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
15860 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
15870 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
15880 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
15890 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
158a0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
158b0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
158c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
158d0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
158e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
158f0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
15900 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65  }.      if( isMe
15910 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mdb ){.        m
15920 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e  emcpy(zFullPathn
15930 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ame, zFilename, 
15940 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
15950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
15970 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
15980 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
159c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
159d0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
159e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
159f0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
15a00 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
15a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15a20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
15a30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
15a40 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
15a50 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
15a60 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
15a70 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
15a80 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
15a90 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
15aa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
15ab0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
15ac0 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
15ad0 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
15ae0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15af0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
15b00 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
15b10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
15b20 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
15b30 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
15b40 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
15b50 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
15b60 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
15b70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
15b80 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
15b90 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
15ba0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
15bb0 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
15bc0 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
15bd0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
15be0 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
15c10 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
15c20 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
15c30 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
15c40 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
15c50 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
15c60 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
15c70 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
15c80 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
15c90 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
15ca0 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
15cb0 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
15cc0 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15ce0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15cf0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
15d00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15d10 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15d20 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
15d30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15d40 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
15d50 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
15d60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15d70 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
15d80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15d90 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
15da0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15dc0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
15dd0 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
15de0 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
15df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15e00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15e10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15e20 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
15e30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15e40 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
15e50 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
15e60 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
15e70 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
15e80 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
15e90 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
15ea0 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
15eb0 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
15ec0 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
15ed0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
15ee0 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
15ef0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
15f00 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
15f10 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
15f20 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
15f30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15f40 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
15f50 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
15f60 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
15f70 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
15f80 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
15f90 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
15fa0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
15fb0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
15fc0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
15fd0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
15fe0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
15ff0 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
16000 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
16010 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
16020 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
16030 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
16040 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
16050 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
16060 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
16070 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
16080 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
16090 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
160a0 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29  sizeof(i64)==8 )
160b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
160c0 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a  zeof(u64)==8 );.
160d0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
160e0 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
160f0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16100 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
16110 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
16120 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
16130 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
16140 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
16150 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
16160 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
16170 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16180 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
16190 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
161a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
161b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
161c0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
161d0 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
161e0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
16200 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20  izeof(MemPage), 
16210 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c  flags, vfsFlags,
16220 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
16230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
16250 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
16260 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
16270 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a  r, db->szMmap);.
16280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16290 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
162a0 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
162b0 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
162c0 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
162d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
162e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
162f0 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
16300 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
16310 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
16320 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
16330 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
16340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
16350 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
16360 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
16370 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
16380 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
16390 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
163a0 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
163b0 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
163c0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
163d0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
163e0 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
163f0 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62  pPager) ) pBt->b
16400 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
16410 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65  EAD_ONLY;.#if de
16420 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43  fined(SQLITE_SEC
16430 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20  URE_DELETE).    
16440 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
16450 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
16460 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  TE;.#elif define
16470 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53 45  d(SQLITE_FAST_SE
16480 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20  CURE_DELETE).   
16490 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
164a0 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3b  = BTS_OVERWRITE;
164b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
164c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
164d0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
164e0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
164f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
16500 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
16510 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
16520 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
16530 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
16540 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
16550 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
16560 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
16570 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
16580 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
16590 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
165a0 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
165b0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
165c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
165d0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
165e0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
165f0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
16600 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
16610 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
16620 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
16630 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
16640 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
16650 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16660 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
16670 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
16680 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
16690 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
166a0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
166b0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
166c0 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
166d0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
166e0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
166f0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
16700 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
16710 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
16720 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
16730 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
16740 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
16750 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
16760 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
16770 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
16780 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
16790 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
167a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
167b0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
167c0 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
167d0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
167e0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
167f0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
16800 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
16810 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
16820 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
16830 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
16840 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
16850 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
16860 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
16870 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
16880 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
16890 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
168a0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
168b0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
168c0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
168d0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
168e0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
168f0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
16900 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
16910 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
16920 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
16930 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
16940 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
16950 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16960 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
16970 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
16980 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
16990 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
169a0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
169b0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
169c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
169d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
169e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
169f0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
16a00 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
16a10 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
16a20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
16a30 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
16a40 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
16a50 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
16a60 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
16a70 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
16a80 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
16a90 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
16aa0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
16ab0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
16ac0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
16ad0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
16ae0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
16af0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
16b00 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
16b10 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
16b20 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
16b30 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
16b40 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
16b50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16b60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16b70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
16b80 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
16b90 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
16ba0 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
16bb0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
16bc0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
16bd0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
16be0 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65   */.    pBt->nRe
16bf0 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  f = 1;.    if( p
16c00 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
16c10 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
16c20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
16c30 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
16c40 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
16c50 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
16c60 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
16c70 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
16c80 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
16c90 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
16ca0 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
16cb0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16cc0 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
16cd0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
16ce0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
16cf0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
16d00 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
16d10 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
16d20 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
16d30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16d40 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
16d50 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
16d60 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
16d70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16d80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16d90 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
16da0 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
16db0 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
16dc0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
16dd0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
16de0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
16df0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
16e00 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
16e10 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
16e20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
16e30 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
16e40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
16e50 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
16e60 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
16e70 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
16e80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16e90 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
16ea0 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
16eb0 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
16ec0 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
16ed0 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
16ee0 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
16ef0 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
16f00 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
16f10 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
16f20 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
16f30 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
16f40 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
16f50 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
16f60 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
16f70 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
16f80 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
16f90 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
16fa0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
16fb0 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
16fc0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
16fd0 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
16fe0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
16ff0 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
17000 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
17010 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
17020 20 20 20 20 20 20 20 69 66 28 20 28 75 70 74 72         if( (uptr
17030 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53  )p->pBt<(uptr)pS
17040 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
17050 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
17060 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
17070 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
17080 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
17090 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
170a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
170b0 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
170c0 4e 65 78 74 20 26 26 20 28 75 70 74 72 29 70 53  Next && (uptr)pS
170d0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28  ib->pNext->pBt<(
170e0 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20  uptr)p->pBt ){. 
170f0 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
17100 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
17110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17120 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
17130 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
17140 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
17150 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
17160 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
17170 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
17180 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
17190 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
171a0 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
171b0 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
171c0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
171d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
171e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
171f0 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
17200 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
17210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17220 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
17230 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
17240 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
17250 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
17260 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
17270 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17280 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
17290 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
172a0 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
172b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
172c0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b  te3_file *pFile;
172d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
172e0 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
172f0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
17300 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
17310 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
17320 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
17330 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
17340 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
17350 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
17360 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
17370 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
17380 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
17390 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
173a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
173b0 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
173c0 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
173d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
173e0 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
173f0 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
17400 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
17410 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ZE);.    }..    
17420 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
17430 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
17440 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
17450 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
17460 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
17470 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
17480 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46  (pFile, SQLITE_F
17490 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a  CNTL_PDB, (void*
174a0 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20  )&pBt->db);.    
174b0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
174c0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
174d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
174e0 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
174f0 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
17500 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
17510 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
17520 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
17530 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
17540 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43  BtreeConnectionC
17550 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30  ount(*ppBtree)>0
17560 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
17570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
17580 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
17590 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
175a0 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
175b0 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
175c0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
175d0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
175e0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
175f0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
17600 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
17610 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
17620 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
17630 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
17640 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
17650 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
17660 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
17670 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
17680 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
17690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
176a0 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
176b0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
176c0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
176d0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
176e0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
176f0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
17700 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17710 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
17720 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
17730 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
17740 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
17750 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
17760 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
17770 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
17780 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
17790 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
177a0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
177b0 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
177c0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
177d0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
177e0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
177f0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
17800 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
17810 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
17820 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
17830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17840 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
17850 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
17860 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
17870 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
17880 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
17890 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
178a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
178b0 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
178c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
178d0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
178e0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
178f0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
17900 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
17910 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
17920 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
17930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
17940 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
17950 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
17960 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
17970 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
17980 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
17990 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
179a0 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
179b0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
179c0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
179d0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
179e0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
179f0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
17a00 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
17a10 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
17a20 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
17a30 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
17a40 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
17a50 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
17a60 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
17a70 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
17a80 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
17a90 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
17aa0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
17ab0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
17ac0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
17ad0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
17ae0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
17af0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
17b00 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
17b10 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
17b20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
17b30 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
17b40 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
17b50 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
17b60 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
17b70 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
17b80 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
17b90 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
17ba0 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
17bb0 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
17bc0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
17bd0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
17be0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
17bf0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
17c00 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
17c10 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
17c20 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
17c30 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
17c40 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
17c50 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
17c60 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
17c70 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
17c80 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
17c90 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
17ca0 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
17cb0 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
17cc0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
17cd0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
17ce0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
17cf0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
17d00 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
17d10 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
17d20 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
17d30 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
17d40 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
17d50 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
17d60 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
17d70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
17d80 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
17d90 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
17da0 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
17db0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
17dc0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
17dd0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
17de0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
17df0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
17e00 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
17e10 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
17e20 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
17e30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
17e40 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
17e50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
17e60 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
17e70 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
17e80 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
17e90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
17ea0 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
17eb0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
17ec0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
17ed0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
17ee0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
17ef0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
17f00 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
17f10 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
17f20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
17f30 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
17f40 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
17f50 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
17f60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
17f70 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
17f80 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
17f90 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
17fa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17fb0 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
17fc0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
17fd0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17fe0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
17ff0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
18000 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
18010 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
18020 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
18030 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18040 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
18050 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18060 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
18070 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
18080 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
18090 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
180a0 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
180b0 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
180c0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
180d0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
180e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
180f0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
18100 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
18110 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
18120 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
18130 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
18140 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
18150 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
18160 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
18170 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
18180 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
18190 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
181a0 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
181b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
181c0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
181d0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
181e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
181f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
18200 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
18210 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
18220 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
18230 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
18240 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
18250 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
18260 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
18270 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
18280 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
18290 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
182a0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
182b0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
182c0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
182d0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
182e0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
182f0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
18300 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
18310 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
18320 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
18330 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
18340 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
18350 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
18360 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
18370 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
18380 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
18390 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
183a0 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
183b0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
183c0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
183d0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
183e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
183f0 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42  >db);.    if( pB
18400 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
18410 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
18420 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
18430 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
18440 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
18450 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18460 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  0, pBt->pSchema)
18470 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
18480 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ace(pBt);.    sq
18490 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
184a0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
184b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
184c0 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28  _CACHE.  assert(
184d0 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
184e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
184f0 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
18500 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20   if( p->pPrev ) 
18510 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
18520 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66  = p->pNext;.  if
18530 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e  ( p->pNext ) p->
18540 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
18550 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a  ->pPrev;.#endif.
18560 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
18570 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
18580 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18590 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66   Change the "sof
185a0 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  t" limit on the 
185b0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
185c0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
185d0 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f   Unused and unmo
185e0 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c  dified pages wil
185f0 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68  l be recycled wh
18600 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
18610 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65  .** pages in the
18620 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74   cache exceeds t
18630 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20  his soft limit. 
18640 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66   But the size of
18650 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73   the.** cache is
18660 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77   allowed to grow
18670 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
18680 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f  s limit if it co
18690 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20  ntains.** dirty 
186a0 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73  pages or pages s
186b0 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75  till in active u
186c0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
186d0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
186e0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
186f0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
18700 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18710 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
18720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18730 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
18740 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18750 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
18760 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
18770 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
18780 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
18790 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
187a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
187b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
187c0 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69   Change the "spi
187d0 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ll" limit on the
187e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
187f0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
18800 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
18810 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73  of pages exceeds
18820 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69   this limit duri
18830 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ng a write trans
18840 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70  action,.** the p
18850 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d  ager might attem
18860 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61  pt to "spill" pa
18870 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ges to the journ
18880 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f  al early in.** o
18890 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
188a0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
188b0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
188c0 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   is the current 
188d0 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20  spill size.  If 
188e0 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a  zero is passed.*
188f0 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
18900 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  , no changes are
18910 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69   made to the spi
18920 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c  ll size setting,
18930 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50   so.** using mxP
18940 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61  age of 0 is a wa
18950 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63  y to query the c
18960 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
18970 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18980 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69  3BtreeSetSpillSi
18990 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
189a0 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
189b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
189c0 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  Bt;.  int res;. 
189d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
189e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
189f0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
18a00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18a10 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  (p);.  res = sql
18a20 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c  ite3PagerSetSpil
18a30 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  lsize(pBt->pPage
18a40 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
18a50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18a60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  p);.  return res
18a70 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
18a80 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
18a90 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
18aa0 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
18ab0 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
18ac0 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
18ad0 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
18ae0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
18af0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
18b00 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
18b10 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
18b20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
18b30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
18b40 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
18b50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18b60 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
18b70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18b80 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
18b90 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
18ba0 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
18bb0 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
18bc0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18bd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18be0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
18bf0 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
18c00 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
18c10 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
18c20 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
18c30 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
18c40 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
18c50 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
18c60 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
18c70 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
18c80 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
18c90 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
18ca0 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
18cb0 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
18cc0 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
18cd0 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
18ce0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
18cf0 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
18d00 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
18d10 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
18d20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
18d30 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
18d40 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
18d50 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
18d60 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
18d70 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
18d80 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
18d90 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
18da0 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
18db0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
18dc0 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
18dd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
18de0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
18df0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
18e00 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
18e10 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
18e20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
18e30 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
18e40 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
18e50 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
18e60 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
18e70 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
18e80 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
18e90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
18ea0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
18eb0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18ec0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
18ed0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18ee0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
18ef0 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
18f00 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
18f10 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
18f20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18f40 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
18f50 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
18f60 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
18f70 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
18f80 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
18f90 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
18fa0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
18fb0 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
18fc0 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
18fd0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
18fe0 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
18ff0 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
19000 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
19010 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
19020 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
19030 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
19040 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
19050 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
19060 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
19070 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
19080 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
19090 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
190a0 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
190b0 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
190c0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
190d0 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
190e0 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
190f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19100 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
19110 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
19120 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
19130 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
19140 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
19150 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
19160 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
19170 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
19180 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
19190 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
191a0 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
191b0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
191c0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
191d0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
191e0 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
191f0 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
19200 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
19210 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
19220 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  e BTS_PAGESIZE_F
19230 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74  IXED flag is set
19240 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
19250 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
19260 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
19270 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
19280 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
19290 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
192a0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
192b0 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
192c0 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
192d0 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
192e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
192f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19300 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
19310 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
19320 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
19330 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19340 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53  eEnter(p);.#if S
19350 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
19360 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70    if( nReserve>p
19370 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
19380 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61  ve ) pBt->optima
19390 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e  lReserve = (u8)n
193a0 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
193b0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
193c0 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
193d0 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
193e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
193f0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
19400 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
19410 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
19420 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
19430 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
19440 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
19450 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
19460 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
19470 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
19480 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
19490 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
194a0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
194b0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
194c0 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
194d0 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
194e0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
194f0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
19500 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
19510 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
19520 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
19530 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
19540 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
19550 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
19560 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
19570 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
19580 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
19590 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
195a0 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
195b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
195c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
195d0 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
195e0 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
195f0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
19600 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
19610 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19620 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19630 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19640 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
19650 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
19660 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
19670 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
19680 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
19690 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
196a0 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
196b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
196c0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
196d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
196e0 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
196f0 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
19700 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
19710 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
19720 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
19730 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
19740 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
19750 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
19760 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
19770 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
19780 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
19790 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
197a0 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
197b0 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
197c0 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
197d0 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
197e0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
197f0 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
19800 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
19810 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
19820 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
19830 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
19840 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
19850 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
19860 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
19870 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
19880 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
19890 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
198a0 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
198b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
198c0 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
198d0 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
198e0 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  int n;.  assert(
198f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19900 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
19910 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  x) );.  n = p->p
19920 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
19930 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
19940 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  e;.  return n;.}
19950 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
19960 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
19970 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
19980 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
19990 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
199a0 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
199b0 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
199c0 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
199d0 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
199e0 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
199f0 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
19a00 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
19a10 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65  _HAS_MUTEX is de
19a20 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e  fined then the n
19a30 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
19a40 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72  s the.** greater
19a50 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
19a60 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61  reserved space a
19a70 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72  nd the maximum r
19a80 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65  equested.** rese
19a90 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e  rve space..*/.in
19aa0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
19ab0 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28  tOptimalReserve(
19ac0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
19ad0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
19ae0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
19af0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
19b00 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
19b10 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
19b20 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
19b30 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  ( n<p->pBt->opti
19b40 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d  malReserve ) n =
19b50 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c   p->pBt->optimal
19b60 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
19b70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19b80 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19b90 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65   n;.}.../*.** Se
19ba0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
19bb0 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
19bc0 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
19bd0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
19be0 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
19bf0 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
19c00 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
19c10 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
19c20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
19c30 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
19c40 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
19c50 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
19c60 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
19c70 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
19c80 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
19c90 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
19ca0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19cb0 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
19cc0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
19cd0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
19ce0 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
19cf0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
19d00 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
19d10 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
19d20 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42 54  alues for the BT
19d30 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
19d40 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
19d50 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  E flags:.**.**  
19d60 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20 20    newFlag==0    
19d70 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43 55     Both BTS_SECU
19d80 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54  RE_DELETE and BT
19d90 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65 20  S_OVERWRITE are 
19da0 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65  cleared.**    ne
19db0 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20 42  wFlag==1       B
19dc0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
19dd0 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56 45   set and BTS_OVE
19de0 52 57 52 49 54 45 20 69 73 20 63 6c 65 61 72 65  RWRITE is cleare
19df0 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  d.**    newFlag=
19e00 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53 45 43  =2       BTS_SEC
19e10 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61 72  URE_DELETE clear
19e20 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  ed and BTS_OVERW
19e30 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20 20  RITE is set.**  
19e40 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20    newFlag==(-1) 
19e50 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a     No changes.**
19e60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19e70 20 61 63 74 73 20 61 73 20 61 20 71 75 65 72 79   acts as a query
19e80 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 6c   if newFlag is l
19e90 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a  ess than zero.**
19ea0 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56 45  .** With BTS_OVE
19eb0 52 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c 65  RWRITE set, dele
19ec0 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f  ted content is o
19ed0 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a 65  verwritten by ze
19ee0 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65  ros, but.** free
19ef0 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20  list leaf pages 
19f00 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  are not written 
19f10 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
19f20 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d 70  base.  Thus in-p
19f30 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63  age.** deleted c
19f40 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72 65  ontent is cleare
19f50 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74 20  d, but freelist 
19f60 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20  deleted content 
19f70 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  is not..**.** Wi
19f80 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  th BTS_SECURE_DE
19f90 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20  LETE, operation 
19fa0 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52  is like BTS_OVER
19fb0 57 52 49 54 45 20 77 69 74 68 20 74 68 65 20 61  WRITE with the a
19fc0 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ddition.** that 
19fd0 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
19fe0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
19ff0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
1a000 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73 69  tabase, increasi
1a010 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74  ng.** the amount
1a020 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f   of disk I/O..*/
1a030 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a040 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
1a050 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
1a060 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
1a070 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1a080 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
1a090 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a0a0 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45 52  assert( BTS_OVER
1a0b0 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55 52  WRITE==BTS_SECUR
1a0c0 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20  E_DELETE*2 );.  
1a0d0 61 73 73 65 72 74 28 20 42 54 53 5f 46 41 53 54  assert( BTS_FAST
1a0e0 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56  _SECURE==(BTS_OV
1a0f0 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43 55  ERWRITE|BTS_SECU
1a100 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20 20  RE_DELETE) );.  
1a110 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
1a120 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
1a130 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 46  sFlags &= ~BTS_F
1a140 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20 20  AST_SECURE;.    
1a150 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
1a160 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
1a170 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20  ELETE*newFlag;. 
1a180 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74   }.  b = (p->pBt
1a190 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1a1a0 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42 54  _FAST_SECURE)/BT
1a1b0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
1a1c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1a1d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1a1e0 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
1a1f0 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
1a200 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
1a210 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1a220 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
1a230 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
1a240 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
1a250 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
1a260 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
1a270 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
1a280 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
1a290 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
1a2a0 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
1a2b0 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
1a2c0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
1a2d0 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
1a2e0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
1a2f0 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
1a300 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
1a310 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
1a320 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
1a330 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1a340 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1a350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a360 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
1a370 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a380 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
1a390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a3a0 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
1a3b0 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
1a3c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a3d0 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
1a3e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
1a3f0 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
1a400 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
1a410 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1a420 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a430 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
1a440 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
1a450 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
1a460 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
1a470 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
1a480 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
1a490 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a4a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
1a4b0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1a4c0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
1a4d0 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
1a4e0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
1a4f0 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
1a500 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
1a510 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1a520 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
1a530 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
1a540 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
1a550 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
1a560 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a570 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
1a580 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
1a590 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
1a5a0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1a5b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1a5c0 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
1a5d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
1a5e0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
1a5f0 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
1a600 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
1a610 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
1a620 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
1a630 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
1a640 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
1a650 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1a660 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
1a670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1a680 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65   user has not se
1a690 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  t the safety-lev
1a6a0 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  el for this data
1a6b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
1a6c0 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41  ** using "PRAGMA
1a6d0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61   synchronous", a
1a6e0 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79  nd if the safety
1a6f0 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c  -level is not al
1a700 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20  ready.** set to 
1a710 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
1a720 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1a730 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  n as the second 
1a740 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65  parameter,.** se
1a750 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20  t it so..*/.#if 
1a760 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1a770 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49  YNCHRONOUS!=SQLI
1a780 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
1a790 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20  YNCHRONOUS \.   
1a7a0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1a7b0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74  ITE_OMIT_WAL).st
1a7c0 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 66  atic void setDef
1a7d0 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53  aultSyncFlag(BtS
1a7e0 68 61 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73  hared *pBt, u8 s
1a7f0 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20  afety_level){.  
1a800 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
1a810 62 20 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64  b *pDb;.  if( (d
1a820 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26  b=pBt->db)!=0 &&
1a830 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d   (pDb=db->aDb)!=
1a840 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
1a850 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70  pDb->pBt==0 || p
1a860 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42  Db->pBt->pBt!=pB
1a870 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20  t ){ pDb++; }.  
1a880 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63    if( pDb->bSync
1a890 53 65 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Set==0 .     && 
1a8a0 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
1a8b0 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  l!=safety_level 
1a8c0 0a 20 20 20 20 20 26 26 20 70 44 62 21 3d 26 64  .     && pDb!=&d
1a8d0 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29  b->aDb[1] .    )
1a8e0 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66  {.      pDb->saf
1a8f0 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65  ety_level = safe
1a900 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20  ty_level;.      
1a910 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
1a920 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
1a930 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
1a940 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20  >safety_level | 
1a950 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47  (db->flags & PAG
1a960 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b  ER_FLAGS_MASK));
1a970 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
1a980 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44  se.# define setD
1a990 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
1a9a0 42 74 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  Bt,safety_level)
1a9b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
1a9c0 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
1a9d0 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
1a9e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1a9f0 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
1aa00 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
1aa10 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
1aa20 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
1aa30 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
1aa40 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
1aa50 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
1aa60 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
1aa70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
1aa80 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
1aa90 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
1aaa0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
1aab0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
1aac0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
1aad0 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
1aae0 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
1aaf0 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
1ab00 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
1ab10 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
1ab20 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
1ab30 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Bt){.  int rc;  
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ab50 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
1ab60 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
1ab70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1ab80 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31  1;     /* Page 1
1ab90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1aba0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
1abb0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1abc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1abd0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
1abe0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  se */.  int nPag
1abf0 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20  eFile = 0;   /* 
1ac00 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1ac10 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1ac20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
1ac30 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f  ageHeader;     /
1ac40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1ac50 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1ac60 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68  e according to h
1ac70 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dr */..  assert(
1ac80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1ac90 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1aca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1acb0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
1acc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1acd0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
1ace0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
1acf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ad00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
1ad10 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1ad20 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
1ad30 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
1ad40 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1ad50 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
1ad60 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
1ad70 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
1ad80 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
1ad90 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
1ada0 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
1adb0 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61  ile. .  */.  nPa
1adc0 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72  ge = nPageHeader
1add0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
1ade0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
1adf0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  a);.  sqlite3Pag
1ae00 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1ae10 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46  >pPager, &nPageF
1ae20 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
1ae30 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
1ae40 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
1ae50 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
1ae60 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
1ae70 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
1ae80 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
1ae90 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
1aea0 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
1aeb0 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
1aec0 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
1aed0 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
1aee0 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
1aef0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
1af00 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1af10 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20  : R-43737-39999 
1af20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69  Every valid SQLi
1af30 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
1af40 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77   begins.    ** w
1af50 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
1af60 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20 68  g 16 bytes (in h
1af70 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36 39  ex): 53 51 4c 69
1af80 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66 20   74 65 20 66 6f 
1af90 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20  72 6d.    ** 61 
1afa0 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a  74 20 33 00. */.
1afb0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
1afc0 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
1afd0 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
1afe0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1aff0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1b000 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1b010 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66  _OMIT_WAL.    if
1b020 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
1b030 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1b040 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
1b050 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
1b060 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
1b070 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1b080 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1b090 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
1b0a0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
1b0b0 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
1b0c0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1b0d0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
1b0e0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
1b0f0 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>2 ){.      go
1b100 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1b110 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
1b120 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65   /* If the write
1b130 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20   version is set 
1b140 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62  to 2, this datab
1b150 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63  ase should be ac
1b160 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e  cessed.    ** in
1b170 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68   WAL mode. If th
1b180 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72  e log is not alr
1b190 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20  eady open, open 
1b1a0 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20  it now. Then .  
1b1b0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
1b1c0 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e  TE_OK and return
1b1d0 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74   without populat
1b1e0 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61  ing BtShared.pPa
1b1f0 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ge1..    ** The 
1b200 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74  caller detects t
1b210 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  his and calls th
1b220 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1b230 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a  n. This is.    *
1b240 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68  * required as th
1b250 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  e version of pag
1b260 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  e 1 currently in
1b270 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65   the page1 buffe
1b280 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  r.    ** may not
1b290 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76   be the latest v
1b2a0 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d  ersion - there m
1b2b0 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e  ay be a newer on
1b2c0 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20  e in the log.   
1b2d0 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f   ** file..    */
1b2e0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
1b2f0 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62  9]==2 && (pBt->b
1b300 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f  tsFlags & BTS_NO
1b310 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _WAL)==0 ){.    
1b320 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
1b330 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1b340 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
1b350 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
1b360 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
1b370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b380 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1b390 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1b3a0 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  d;.      }else{.
1b3b0 20 20 20 20 20 20 20 20 73 65 74 44 65 66 61 75          setDefau
1b3c0 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20  ltSyncFlag(pBt, 
1b3d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
1b3e0 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  AL_SYNCHRONOUS+1
1b3f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1b400 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  sOpen==0 ){.    
1b410 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1b420 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1b430 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1b440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1b450 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b460 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1b470 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  TADB;.    }else{
1b480 0a 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c  .      setDefaul
1b490 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53  tSyncFlag(pBt, S
1b4a0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
1b4b0 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20  NCHRONOUS+1);.  
1b4c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1b4d0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1b4e0 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54 68  R-15465-20813 Th
1b4f0 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69  e maximum and mi
1b500 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70  nimum embedded p
1b510 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72  ayload.    ** fr
1b520 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  actions and the 
1b530 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61  leaf payload fra
1b540 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73  ction values mus
1b550 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64  t be 64, 32, and
1b560 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   32..    **.    
1b570 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
1b580 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
1b590 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
1b5a0 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
1b5b0 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
1b5c0 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
1b5d0 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
1b5e0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1b5f0 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
1b600 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
1b610 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
1b620 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1b630 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1b640 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1b650 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
1b660 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
1b670 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
1b680 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
1b690 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1b6a0 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
1b6b0 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
1b6c0 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
1b6d0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
1b6e0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1b6f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b700 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65   */.    pageSize
1b710 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
1b720 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
1b730 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  16);.    /* EVID
1b740 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38  ENCE-OF: R-25008
1b750 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a 65 20  -21688 The size 
1b760 6f 66 20 61 20 70 61 67 65 20 69 73 20 61 20 70  of a page is a p
1b770 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20  ower of two.    
1b780 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  ** between 512 a
1b790 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69  nd 65536 inclusi
1b7a0 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  ve. */.    if( (
1b7b0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
1b7c0 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c  eSize)!=0.     |
1b7d0 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  | pageSize>SQLIT
1b7e0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
1b7f0 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
1b800 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20  e<=256 .    ){. 
1b810 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1b820 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1b830 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
1b840 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
1b850 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
1b860 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d  NCE-OF: R-59310-
1b870 35 31 32 30 35 20 54 68 65 20 22 72 65 73 65 72  51205 The "reser
1b880 76 65 64 20 73 70 61 63 65 22 20 73 69 7a 65 20  ved space" size 
1b890 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20  in the 1-byte.  
1b8a0 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20    ** integer at 
1b8b0 6f 66 66 73 65 74 20 32 30 20 69 73 20 74 68 65  offset 20 is the
1b8c0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1b8d0 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
1b8e0 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65   end of.    ** e
1b8f0 61 63 68 20 70 61 67 65 20 74 6f 20 72 65 73 65  ach page to rese
1b900 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f  rve for extensio
1b910 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ns. .    **.    
1b920 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1b930 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
1b940 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
1b950 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
1b960 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
1b970 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
1b980 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
1b990 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
1b9a0 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
1b9b0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74   ** into the dat
1b9c0 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
1b9d0 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65  r. */.    usable
1b9e0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
1b9f0 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
1ba00 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69   if( (u32)pageSi
1ba10 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
1ba20 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
1ba30 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
1ba40 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1ba50 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
1ba60 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
1ba70 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
1ba80 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
1ba90 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
1baa0 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
1bab0 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
1bac0 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
1bad0 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
1bae0 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
1baf0 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
1bb00 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
1bb10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bb20 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
1bb30 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
1bb40 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
1bb50 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
1bb60 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
1bb70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1bb80 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1bb90 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
1bba0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
1bbb0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
1bbc0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
1bbd0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
1bbe0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
1bbf0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
1bc00 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1bc10 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
1bc20 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
1bc30 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
1bc60 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
1bc70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bc80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
1bc90 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
1bca0 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
1bcb0 61 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  a)==0 && nPage>n
1bcc0 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
1bcd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1bce0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1bcf0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1bd00 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1bd10 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1bd20 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
1bd30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
1bd40 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
1bd50 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
1bd60 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
1bd70 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
1bd80 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
1bd90 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
1bda0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1bdb0 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
1bdc0 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
1bdd0 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
1bde0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
1bdf0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1be00 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1be10 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
1be20 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1be30 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
1be40 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
1be50 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
1be60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1be70 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
1be80 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
1be90 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
1bea0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
1beb0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1bec0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
1bed0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
1bee0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
1bef0 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
1bf00 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
1bf10 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
1bf20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
1bf30 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
1bf40 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
1bf50 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
1bf60 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
1bf70 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
1bf80 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
1bf90 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
1bfa0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
1bfb0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
1bfc0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
1bfd0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
1bfe0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
1bff0 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
1c000 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1c010 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
1c020 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
1c030 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
1c040 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
1c050 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
1c060 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
1c070 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
1c080 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
1c090 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
1c0a0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
1c0b0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
1c0c0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
1c0d0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
1c0e0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
1c0f0 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
1c100 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
1c110 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
1c120 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
1c130 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
1c140 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
1c150 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1c160 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
1c170 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
1c180 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
1c190 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1c1a0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
1c1b0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
1c1c0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
1c1d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
1c1e0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
1c1f0 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
1c200 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
1c210 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
1c220 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
1c230 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
1c240 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
1c250 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
1c260 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1c270 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
1c280 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
1c290 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1c2a0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
1c2b0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
1c2c0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
1c2d0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
1c2e0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1c2f0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1c300 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
1c310 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
1c320 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1c330 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
1c340 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
1c350 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1c360 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
1c370 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1c380 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   of cursors open
1c390 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73   on pBt. This is
1c3a0 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
1c3b0 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
1c3c0 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
1c3d0 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
1c3e0 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
1c3f0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  defined..**.** O
1c400 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
1c410 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66  s are counted if
1c420 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e   wrOnly is true.
1c430 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a    If wrOnly is.*
1c440 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c  * false then all
1c450 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
1c460 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  nted..**.** For 
1c470 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
1c480 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
1c490 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
1c4a0 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
1c4b0 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69  capable of readi
1c4c0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  ng or writing to
1c4d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1c4e0 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20  Cursors that.** 
1c4f0 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65  have been trippe
1c500 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f  d into the CURSO
1c510 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72  R_FAULT state ar
1c520 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a  e not counted..*
1c530 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
1c540 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42  ntValidCursors(B
1c550 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
1c560 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  t wrOnly){.  BtC
1c570 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
1c580 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
1c590 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
1c5a0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
1c5b0 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
1c5c0 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c  if( (wrOnly==0 |
1c5d0 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  | (pCur->curFlag
1c5e0 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
1c5f0 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  ag)!=0).     && 
1c600 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1c610 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
1c620 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
1c630 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
1c640 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1c650 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
1c660 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
1c670 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
1c680 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
1c690 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
1c6a0 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
1c6b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c6c0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1c6d0 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
1c6e0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1c6f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c700 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
1c710 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
1c720 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
1c730 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
1c740 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
1c750 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1c760 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
1c770 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1c780 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1c790 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1c7a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1c7b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c7c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1c7d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1c7e0 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1c7f0 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d  Cursors(pBt,0)==
1c800 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
1c810 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
1c820 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
1c830 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1c840 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
1c850 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
1c860 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1c870 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1c880 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1c890 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1c8a0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1c8b0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1c8c0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
1c8d0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   );.    pBt->pPa
1c8e0 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ge1 = 0;.    rel
1c8f0 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1c900 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e1);.  }.}../*.*
1c910 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
1c920 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
1c930 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
1c940 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
1c950 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
1c960 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
1c970 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
1c980 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
1c990 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1c9a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
1c9b0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
1c9c0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
1c9d0 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
1c9e0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
1c9f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ca00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ca10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1ca20 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
1ca30 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
1ca40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ca50 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
1ca60 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
1ca70 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
1ca80 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
1ca90 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
1caa0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
1cab0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
1cac0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1cad0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
1cae0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
1caf0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
1cb00 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
1cb10 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1cb20 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
1cb30 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
1cb40 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
1cb50 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
1cb60 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
1cb70 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
1cb80 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
1cb90 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
1cba0 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
1cbb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
1cbc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
1cbd0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1cbe0 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
1cbf0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
1cc00 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
1cc10 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
1cc20 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
1cc30 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
1cc40 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
1cc50 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
1cc60 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
1cc70 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
1cc80 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
1cc90 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
1cca0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
1ccb0 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1ccc0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1ccd0 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
1cce0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ccf0 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
1cd00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1cd10 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
1cd20 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
1cd30 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
1cd40 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1cd50 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
1cd60 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1cd70 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
1cd80 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1cd90 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1cda0 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
1cdb0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
1cdc0 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
1cdd0 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
1cde0 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
1cdf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1ce00 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1ce10 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1ce20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1ce30 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20  ile (creating a 
1ce40 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73  database.** cons
1ce50 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
1ce60 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73  le page and no s
1ce70 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20  chema objects). 
1ce80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1ce90 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75  .** if successfu
1cea0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
1ceb0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1cec0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
1ced0 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42  ite3BtreeNewDb(B
1cee0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1cef0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1cf00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
1cf10 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  >pBt->nPage = 0;
1cf20 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62  .  rc = newDatab
1cf30 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73  ase(p->pBt);.  s
1cf40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1cf50 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1cf60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
1cf70 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
1cf80 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
1cf90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1cfa0 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
1cfb0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1cfc0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
1cfd0 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
1cfe0 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
1cff0 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
1d000 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1d010 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
1d020 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
1d030 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
1d040 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
1d050 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
1d060 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
1d070 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1d080 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
1d090 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
1d0a0 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
1d0b0 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
1d0c0 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
1d0d0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
1d0e0 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
1d0f0 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
1d100 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
1d110 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
1d120 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1d130 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1d140 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
1d150 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1d160 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
1d170 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1d180 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
1d190 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1d1a0 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
1d1b0 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
1d1c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1d1d0 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
1d1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1d1f0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
1d200 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1d210 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
1d220 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1d230 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
1d240 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1d250 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
1d260 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1d270 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
1d280 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1d290 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
1d2a0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1d2b0 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
1d2c0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
1d2d0 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
1d2e0 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
1d2f0 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
1d300 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
1d310 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
1d320 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
1d330 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
1d340 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1d350 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
1d360 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
1d370 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
1d380 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
1d390 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
1d3a0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1d3b0 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
1d3c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
1d3d0 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
1d3e0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1d3f0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
1d400 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1d410 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
1d420 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
1d430 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
1d440 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
1d450 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
1d460 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
1d470 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
1d480 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1d490 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
1d4a0 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
1d4b0 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
1d4c0 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
1d4d0 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
1d4e0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1d4f0 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
1d500 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
1d510 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
1d520 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
1d530 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
1d540 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
1d550 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
1d560 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
1d570 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
1d580 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
1d590 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
1d5a0 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
1d5b0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1d5c0 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
1d5d0 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
1d5e0 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
1d5f0 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
1d600 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1d610 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
1d620 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
1d630 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d640 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
1d650 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d660 20 69 6e 74 20 62 43 6f 6e 63 75 72 72 65 6e 74   int bConcurrent
1d670 20 3d 20 28 70 2d 3e 64 62 2d 3e 62 43 6f 6e 63   = (p->db->bConc
1d680 75 72 72 65 6e 74 20 26 26 20 21 49 53 41 55 54  urrent && !ISAUT
1d690 4f 56 41 43 55 55 4d 29 3b 0a 0a 20 20 73 71 6c  OVACUUM);..  sql
1d6a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1d6b0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1d6c0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1d6d0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
1d6e0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
1d6f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
1d700 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
1d710 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
1d720 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1d730 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1d740 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
1d750 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
1d760 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1d770 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1d780 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
1d790 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
1d7a0 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
1d7b0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
1d7c0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
1d7d0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1d7e0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d7f0 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
1d800 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
1d810 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
1d820 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
1d830 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
1d840 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
1d850 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
1d860 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
1d870 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1d880 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
1d890 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
1d8a0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1d8b0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
1d8c0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
1d8d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d8e0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1d8f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  {.    sqlite3 *p
1d900 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f  Block = 0;.    /
1d910 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
1d920 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
1d930 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
1d940 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
1d950 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ion .    ** on t
1d960 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
1d970 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1d980 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
1d990 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20  ansaction is.   
1d9a0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
1d9b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1d9c0 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  KED..    */.    
1d9d0 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
1d9e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d9f0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
1da00 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74       || (pBt->bt
1da10 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
1da20 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a  DING)!=0.    ){.
1da30 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
1da40 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
1da50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
1da60 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20  rflag>1 ){.     
1da70 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
1da80 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d        for(pIter=
1da90 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1daa0 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1dab0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
1dac0 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1dad0 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
1dae0 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
1daf0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
1db00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1db10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1db20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1db30 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73  Block ){.      s
1db40 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
1db50 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
1db60 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63  Block);.      rc
1db70 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
1db80 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
1db90 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1dba0 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egun;.    }.  }.
1dbb0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
1dbc0 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
1dbd0 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
1dbe0 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
1dbf0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
1dc00 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
1dc10 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
1dc20 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
1dc30 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
1dc40 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
1dc50 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
1dc60 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
1dc70 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
1dc80 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
1dc90 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1dca0 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
1dcb0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
1dcc0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1dcd0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1dce0 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
1dcf0 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
1dd00 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
1dd10 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
1dd20 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1dd30 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
1dd40 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
1dd50 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
1dd60 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
1dd70 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
1dd80 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
1dd90 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
1dda0 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
1ddb0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
1ddc0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
1ddd0 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
1dde0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1ddf0 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
1de00 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
1de10 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
1de20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
1de30 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
1de40 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1de50 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1de60 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
1de70 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
1de80 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
1de90 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
1dea0 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
1deb0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
1dec0 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
1ded0 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
1dee0 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
1def0 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
1df00 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
1df10 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
1df20 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
1df30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1df40 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
1df50 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
1df60 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1df70 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
1df80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1df90 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1dfa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dfb0 20 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20 3d      int exFlag =
1dfc0 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 3f 20 2d   bConcurrent ? -
1dfd0 31 20 3a 20 28 77 72 66 6c 61 67 3e 31 29 3b 0a  1 : (wrflag>1);.
1dfe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1dff0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
1e000 42 74 2d 3e 70 50 61 67 65 72 2c 20 65 78 46 6c  Bt->pPager, exFl
1e010 61 67 2c 20 73 71 6c 69 74 65 33 54 65 6d 70 49  ag, sqlite3TempI
1e020 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
1e030 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1e040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e050 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
1e060 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1e070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e080 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1e090 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e0a0 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
1e0b0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1e0c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
1e0d0 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  e( (rc&0xFF)==SQ
1e0e0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
1e0f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1e100 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
1e110 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
1e120 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
1e130 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  pBt) );..  if( r
1e140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e150 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1e160 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1e170 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
1e180 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
1e190 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e1a0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1e1b0 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
1e1c0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ble ){.        a
1e1d0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
1e1e0 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
1e1f0 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
1e200 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1e210 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
1e220 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
1e230 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
1e240 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
1e250 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
1e260 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
1e270 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
1e280 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
1e290 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
1e2a0 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
1e2b0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1e2c0 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
1e2d0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
1e2e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1e2f0 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
1e300 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
1e310 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
1e320 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1e330 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
1e340 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1e350 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1e360 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
1e370 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
1e380 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
1e390 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  p;.      pBt->bt
1e3a0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45  sFlags &= ~BTS_E
1e3b0 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
1e3c0 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70  if( wrflag>1 ) p
1e3d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1e3e0 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23  BTS_EXCLUSIVE;.#
1e3f0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
1e400 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68  If the db-size h
1e410 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69  eader field is i
1e420 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20  ncorrect (as it 
1e430 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64  may be if an old
1e440 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74  .      ** client
1e450 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e   has been writin
1e460 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1e470 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20  ile), update it 
1e480 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20  now. Doing.     
1e490 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20   ** this sooner 
1e4a0 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
1e4b0 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  r means the data
1e4c0 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61  base size can sa
1e4d0 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72  fely .      ** r
1e4e0 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62  e-read the datab
1e4f0 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61  ase size from pa
1e500 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f  ge 1 if a savepo
1e510 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  int or transacti
1e520 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  on.      ** roll
1e530 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68  back occurs with
1e540 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
1e550 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1e560 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
1e570 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61  e!=get4byte(&pPa
1e580 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20  ge1->aData[28]) 
1e590 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e5a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e5b0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1e5c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1e5d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e5e0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1e5f0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1e600 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1e610 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1e620 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e630 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
1e640 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e650 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
1e660 20 69 66 28 20 62 43 6f 6e 63 75 72 72 65 6e 74   if( bConcurrent
1e670 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1e680 4b 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65  K && sqlite3Page
1e690 72 49 73 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  rIsWal(pBt->pPag
1e6a0 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
1e6b0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1e6c0 6e 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d  nConcurrent(pBt-
1e6d0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1e6e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e6f0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1e700 20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72     rc = btreePtr
1e710 6d 61 70 41 6c 6c 6f 63 61 74 65 28 70 42 74 29  mapAllocate(pBt)
1e720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1e730 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  if..  if( rc==SQ
1e740 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1e750 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
1e760 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1e770 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1e780 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1e790 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
1e7a0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1e7b0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1e7c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1e7d0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1e7e0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
1e7f0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
1e800 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
1e810 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
1e820 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
1e830 20 20 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69      int nSavepoi
1e840 6e 74 20 3d 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  nt = p->db->nSav
1e850 65 70 6f 69 6e 74 3b 0a 20 20 20 20 72 63 20 3d  epoint;.    rc =
1e860 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1e870 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1e880 70 50 61 67 65 72 2c 20 6e 53 61 76 65 70 6f 69  pPager, nSavepoi
1e890 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
1e8a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 53  =SQLITE_OK && nS
1e8b0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
1e8c0 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d    rc = btreePtrm
1e8d0 61 70 42 65 67 69 6e 28 70 42 74 2c 20 6e 53 61  apBegin(pBt, nSa
1e8e0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
1e8f0 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1e900 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
1e910 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1e920 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e930 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e940 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e950 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1e960 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
1e970 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
1e980 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
1e990 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
1e9a0 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
1e9b0 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
1e9c0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1e9d0 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
1e9e0 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
1e9f0 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
1ea00 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
1ea10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ea20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1ea30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1ea40 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
1ea70 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
1ea80 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1eab0 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
1eac0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1eaf0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
1eb00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1eb10 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
1eb20 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
1eb30 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
1eb40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1eb50 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1eb60 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1eb70 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f   pPage->isInit ?
1eb80 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72   SQLITE_OK : btr
1eb90 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1eba0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1ebb0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1ebc0 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  rc;.  nCell = pP
1ebd0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
1ebe0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1ebf0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1ec00 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1ec10 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
1ec20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
1ec30 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1ec40 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
1ec50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1ec60 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1ec70 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
1ec80 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
1ec90 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1eca0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1ecb0 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1ecc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1ecd0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1ece0 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
1ecf0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1ed00 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1ed10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1ed20 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
1ed30 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1ed40 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1ed50 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
1ed60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ed70 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
1ed80 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
1ed90 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
1eda0 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
1edb0 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
1edc0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1edd0 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
1ede0 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
1edf0 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
1ee00 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
1ee10 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
1ee20 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
1ee30 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
1ee40 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1ee50 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1ee60 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
1ee70 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
1ee80 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
1ee90 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1eea0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
1eeb0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1eec0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1eed0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
1eee0 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
1eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1ef00 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1ef10 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
1ef20 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
1ef30 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1ef40 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
1ef50 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
1ef60 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1ef70 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
1efa0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
1efb0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
1efc0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
1efd0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
1efe0 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
1eff0 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
1f000 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f010 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1f020 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1f030 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f040 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1f050 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1f060 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
1f070 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1f080 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
1f090 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
1f0a0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
1f0b0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
1f0c0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
1f0d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
1f0e0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1f0f0 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
1f100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f110 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
1f120 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
1f130 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1f140 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1f150 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
1f160 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1f170 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1f180 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49   rc = pPage->isI
1f190 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  nit ? SQLITE_OK 
1f1a0 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  : btreeInitPage(
1f1b0 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1f1c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f1d0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1f1e0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1f1f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1f200 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
1f210 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1f220 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
1f230 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1f240 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
1f250 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
1f260 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
1f270 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
1f280 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
1f290 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
1f2a0 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
1f2b0 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
1f2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1f2d0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1f2e0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
1f2f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
1f300 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
1f310 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f320 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
1f330 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1f340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1f350 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
1f360 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
1f370 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20  ize-4) ){.      
1f380 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1f390 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
1f3a0 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  4, iTo);.       
1f3b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f3c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f3d0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1f3e0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
1f3f0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
1f400 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
1f410 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
1f420 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1f430 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1f440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f450 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
1f460 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
1f470 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
1f480 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
1f490 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1f4a0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1f4b0 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
1f4c0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
1f4d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f4e0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
1f4f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f500 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1f510 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1f520 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
1f530 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1f540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f550 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
1f560 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1f570 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
1f580 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
1f590 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
1f5a0 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
1f5b0 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
1f5c0 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
1f5d0 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
1f5e0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
1f5f0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
1f600 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
1f610 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
1f620 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
1f630 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
1f640 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
1f650 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
1f660 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
1f670 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
1f680 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
1f690 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
1f6a0 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
1f6b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f6c0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
1f6d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1f6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
1f6f0 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
1f700 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
1f710 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
1f720 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
1f730 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
1f740 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
1f750 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
1f760 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1f770 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
1f780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1f790 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
1f7a0 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
1f7b0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1f7c0 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
1f7d0 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
1f7e0 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
1f7f0 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
1f800 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1f810 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
1f820 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
1f830 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1f840 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
1f850 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
1f860 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
1f870 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
1f880 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
1f890 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
1f8a0 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
1f8b0 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
1f8c0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1f8d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1f8e0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
1f8f0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
1f900 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1f910 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
1f920 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
1f930 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1f940 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1f950 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
1f960 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1f970 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1f980 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
1f990 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
1f9a0 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
1f9b0 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
1f9c0 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
1f9d0 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
1f9e0 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
1f9f0 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
1fa00 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
1fa10 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
1fa20 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
1fa30 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
1fa40 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1fa50 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
1fa60 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
1fa70 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1fa80 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
1fa90 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
1faa0 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
1fab0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1fac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1fad0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
1fae0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
1faf0 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
1fb00 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
1fb10 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
1fb20 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
1fb30 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
1fb40 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
1fb50 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1fb60 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
1fb70 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
1fb80 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
1fb90 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
1fba0 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
1fbb0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
1fbc0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1fbd0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
1fbe0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
1fbf0 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
1fc00 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
1fc10 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1fc20 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
1fc30 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
1fc40 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
1fc50 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
1fc60 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
1fc70 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
1fc80 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
1fc90 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1fca0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1fcb0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1fcc0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1fcd0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1fce0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1fcf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fd00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1fd10 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
1fd20 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
1fd30 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
1fd40 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
1fd50 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
1fd60 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
1fd70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
1fd80 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
1fd90 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
1fda0 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
1fdb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fdc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1fdd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1fde0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1fdf0 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
1fe00 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
1fe10 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
1fe20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
1fe30 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
1fe40 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
1fe50 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
1fe60 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1fe70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
1fe80 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
1fe90 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1fea0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1feb0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1fec0 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
1fed0 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
1fee0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1fef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ff00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ff10 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
1ff20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1ff30 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
1ff40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ff50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ff60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1ff70 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
1ff80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ff90 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
1ffa0 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
1ffb0 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
1ffc0 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
1ffd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ffe0 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
1fff0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20000 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
20010 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
20020 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
20030 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
20040 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20050 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
20060 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
20070 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
20080 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
20090 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
200a0 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
200b0 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
200c0 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
200d0 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
200e0 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
200f0 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
20100 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
20110 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
20120 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  n.** SQLITE_OK. 
20130 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
20140 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
20150 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e  herefore no poin
20160 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67  t in .** calling
20170 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
20180 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
20190 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69  LITE_DONE. Or, i
201a0 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
201b0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f  ccurs, return so
201c0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
201d0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ode..**.** More 
201e0 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68  specifically, th
201f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
20200 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
20210 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ize the database
20220 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65   so .** that the
20230 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
20240 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
20250 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f   in use is no lo
20260 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
20270 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69  ** Parameter nFi
20280 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
20290 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
202a0 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c  is database woul
202b0 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72  d contain.** wer
202c0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
202d0 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20  called until it 
202e0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
202f0 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ONE..**.** If th
20300 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65  e bCommit parame
20310 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
20320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
20330 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
20340 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  .** caller will 
20350 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
20360 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
20370 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
20380 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f  QLITE_DONE .** o
20390 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d  r an error. bCom
203a0 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72  mit is passed tr
203b0 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ue for an auto-v
203c0 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20  acuum-on-commit 
203d0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  .** operation, o
203e0 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69  r false for an i
203f0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
20400 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
20410 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
20420 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
20430 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
20440 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d  LastPg, int bCom
20450 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  mit){.  Pgno nFr
20460 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
20470 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
20480 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
20490 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
204a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
204b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
204c0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
204d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
204e0 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
204f0 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
20500 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
20510 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
20520 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20530 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
20540 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
20550 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
20560 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
20570 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
20580 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
20590 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
205a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
205b0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
205c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
205d0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
205e0 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
205f0 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
20600 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20610 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
20620 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20630 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
20640 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
20650 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20660 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20670 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
20680 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
20690 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
206a0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
206b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
206c0 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
206d0 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
206e0 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
206f0 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
20700 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69      ** if bCommi
20710 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t is non-zero. I
20720 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
20730 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
20740 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
20750 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
20760 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
20770 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
20780 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
20790 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
207a0 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
207b0 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
207c0 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
207d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
207e0 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
207f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
20800 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
20810 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
20820 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
20830 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
20840 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41  tPg, BTALLOC_EXA
20850 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CT);.        if(
20860 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20870 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
20880 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
20890 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
208a0 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
208b0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
208c0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
208d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
208e0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
208f0 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
20900 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
20910 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
20920 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
20930 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
20940 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20  e *pLastPg;.    
20950 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41    u8 eMode = BTA
20960 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d  LLOC_ANY;   /* M
20970 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f  ode parameter fo
20980 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
20990 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50  age() */.      P
209a0 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20  gno iNear = 0;  
209b0 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72           /* near
209c0 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  by parameter for
209d0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
209e0 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ge() */..      r
209f0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
20a00 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
20a10 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
20a20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20a40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20a50 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
20a60 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c  bCommit is zero,
20a70 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
20a80 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
20a90 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
20aa0 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
20ab0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
20ac0 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
20ad0 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
20ae0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
20af0 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
20b00 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f  her hand, if bCo
20b10 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20  mmit is greater 
20b20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
20b30 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
20b40 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
20b50 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
20b60 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
20b70 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
20b80 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
20b90 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
20ba0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43   */.      if( bC
20bb0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
20bc0 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c      eMode = BTAL
20bd0 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  LOC_LE;.        
20be0 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20  iNear = nFin;.  
20bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b      }.      do {
20c00 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
20c10 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
20c20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
20c30 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
20c40 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
20c50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29  g, iNear, eMode)
20c60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
20c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20c80 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
20c90 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
20ca0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
20cb0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
20cc0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20cd0 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
20ce0 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69    }while( bCommi
20cf0 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  t && iFreePg>nFi
20d00 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
20d10 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
20d20 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
20d30 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
20d40 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
20d50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
20d60 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f  ge, iFreePg, bCo
20d70 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c  mmit);.      rel
20d80 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
20d90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20dd0 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69   }..  if( bCommi
20de0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b  t==0 ){.    do {
20df0 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
20e00 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c  ;.    }while( iL
20e10 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
20e20 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c  YTE_PAGE(pBt) ||
20e30 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
20e40 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a  Bt, iLastPg) );.
20e50 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
20e60 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42  cate = 1;.    pB
20e70 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74  t->nPage = iLast
20e80 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Pg;.  }.  return
20e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20ea0 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
20eb0 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
20ec0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
20ed0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
20ee0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72   database.** nOr
20ef0 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ig pages in size
20f00 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65   containing nFre
20f10 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65  e free pages. Re
20f20 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65  turn the expecte
20f30 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  d .** size of th
20f40 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
20f50 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ges following an
20f60 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65   auto-vacuum ope
20f70 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
20f80 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69  c Pgno finalDbSi
20f90 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ze(BtShared *pBt
20fa0 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67  , Pgno nOrig, Pg
20fb0 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74  no nFree){.  int
20fc0 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20fe0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
20ff0 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
21000 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  page */.  Pgno n
21010 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20  Ptrmap;         
21020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21030 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
21040 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
21050 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  */.  Pgno nFin; 
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
21080 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72  alue */..  nEntr
21090 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
210a0 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70  ize/5;.  nPtrmap
210b0 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
210c0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
210d0 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
210e0 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e  )/nEntry;.  nFin
210f0 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
21100 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66   - nPtrmap;.  if
21110 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
21120 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
21130 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
21140 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
21150 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
21160 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50  .  while( PTRMAP
21170 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
21180 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
21190 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
211a0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
211b0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
211c0 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  nFin;.}../*.** A
211d0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
211e0 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
211f0 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
21200 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
21210 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
21220 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
21230 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
21240 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
21250 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
21260 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
21270 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
21280 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
21290 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
212a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
212b0 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
212c0 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
212d0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
212e0 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
212f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
21300 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
21310 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
21320 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
21330 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
21340 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
21350 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
21360 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
21370 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21380 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
21390 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
213a0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
213b0 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
213c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
213d0 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
213e0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
213f0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
21400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
21410 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50  o nOrig = btreeP
21420 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
21430 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20     Pgno nFree = 
21440 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
21450 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
21460 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
21470 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
21480 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
21490 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  );..    if( nOri
214a0 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  g<nFin ){.      
214b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
214c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
214d0 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20  lse if( nFree>0 
214e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
214f0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
21500 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
21510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21520 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
21530 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
21540 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
21550 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
21560 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
21570 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
21580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
215a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
215b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
215c0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
215d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
215e0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
215f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
21600 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
21610 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
21620 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21630 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
21640 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
21650 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
21660 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21670 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
21680 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
21690 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
216a0 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
216b0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
216c0 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61  mmitted for an a
216d0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
216e0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
216f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21700 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
21710 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
21720 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
21730 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
21740 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
21750 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
21760 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
21770 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
21780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
21790 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
217a0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
217b0 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
217c0 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
217d0 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
217e0 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
217f0 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
21800 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
21810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
21820 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
21830 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
21840 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
21850 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
21860 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  efcount(pPager);
21870 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71   )..  assert( sq
21880 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21890 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
218a0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
218b0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
218c0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
218d0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
218e0 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
218f0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
21900 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
21910 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
21920 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
21930 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
21940 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
21950 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
21960 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
21970 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
21980 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
21990 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
219a0 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
219b0 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
219c0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
219d0 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
219e0 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
219f0 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
21a00 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
21a10 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
21a20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
21a30 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
21a40 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
21a50 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
21a60 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
21a70 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
21a80 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
21a90 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
21aa0 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
21ab0 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
21ac0 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
21ad0 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
21ae0 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
21af0 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
21b00 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
21b10 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
21b20 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
21b30 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
21b40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21b50 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
21b60 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
21b70 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
21b80 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
21b90 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
21ba0 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
21bb0 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
21bc0 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
21bd0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21be0 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
21bf0 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
21c00 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
21c10 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
21c20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
21c30 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
21c40 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
21c50 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
21c60 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
21c70 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
21c80 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
21c90 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
21ca0 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
21cb0 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
21cc0 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
21cd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21ce0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
21cf0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
21d00 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
21d10 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
21d20 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
21d30 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
21d40 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
21d50 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
21d60 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
21d70 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
21d80 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
21d90 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
21da0 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
21db0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
21dc0 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
21dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21de0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21df0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
21e00 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
21e10 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
21e20 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
21e30 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
21e40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
21e50 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
21e60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
21e70 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
21e80 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
21e90 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
21ea0 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
21eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
21ec0 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54  NCURRENT./*.** T
21ed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21ee0 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
21ef0 66 20 6d 65 72 67 69 6e 67 20 61 6e 20 43 4f 4e  f merging an CON
21f00 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74  CURRENT transact
21f10 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ion with.** the 
21f20 73 6e 61 70 73 68 6f 74 20 61 74 20 74 68 65 20  snapshot at the 
21f30 68 65 61 64 20 6f 66 20 74 68 65 20 77 61 6c 20  head of the wal 
21f40 66 69 6c 65 2e 20 49 74 20 72 65 6c 6f 63 61 74  file. It relocat
21f50 65 73 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  es all pages in 
21f60 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 69 46 69  the.** range iFi
21f70 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c  rst..iLast, incl
21f80 75 73 69 76 65 2e 20 49 74 20 69 73 20 61 73 73  usive. It is ass
21f90 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 42 74  umed that the Bt
21fa0 72 65 65 50 74 72 6d 61 70 20 0a 2a 2a 20 73 74  reePtrmap .** st
21fb0 72 75 63 74 75 72 65 20 61 74 20 42 74 53 68 61  ructure at BtSha
21fc0 72 65 64 2e 70 4d 61 70 20 63 6f 6e 74 61 69 6e  red.pMap contain
21fd0 73 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  s the location o
21fe0 66 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74  f the pointers t
21ff0 6f 20 65 61 63 68 0a 2a 2a 20 70 61 67 65 20 69  o each.** page i
22000 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2a 0a  n the range..**.
22010 2a 2a 20 49 66 20 70 6e 43 75 72 72 65 6e 74 20  ** If pnCurrent 
22020 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 6c  is NULL, then al
22030 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 72  l pages in the r
22040 61 6e 67 65 20 61 72 65 20 6d 6f 76 65 64 20 74  ange are moved t
22050 6f 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 66  o currently.** f
22060 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20 28 69  ree locations (i
22070 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e  .e. free-list en
22080 74 72 69 65 73 29 20 77 69 74 68 69 6e 20 74 68  tries) within th
22090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
220a0 62 65 66 6f 72 65 20 70 61 67 65 0a 2a 2a 20 69  before page.** i
220b0 46 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  First..**.** Or,
220c0 20 69 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73   if pnCurrent is
220d0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
220e0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  it points to a v
220f0 61 6c 75 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  alue containing 
22100 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73  the.** current s
22110 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
22120 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
22130 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  s. In this case,
22140 20 61 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a   all pages are.*
22150 2a 20 72 65 6c 6f 63 61 74 65 64 20 74 6f 20 74  * relocated to t
22160 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
22170 74 61 62 61 73 65 20 66 69 6c 65 20 2d 20 70 61  tabase file - pa
22180 67 65 20 69 46 69 72 73 74 20 69 73 20 72 65 6c  ge iFirst is rel
22190 6f 63 61 74 65 64 20 74 6f 0a 2a 2a 20 70 61 67  ocated to.** pag
221a0 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 31 29  e (*pnCurrent+1)
221b0 2c 20 70 61 67 65 20 69 46 69 72 73 74 2b 31 20  , page iFirst+1 
221c0 74 6f 20 70 61 67 65 20 28 2a 70 6e 43 75 72 72  to page (*pnCurr
221d0 65 6e 74 2b 32 29 2c 20 61 6e 64 20 73 6f 20 6f  ent+2), and so o
221e0 6e 2e 0a 2a 2a 20 56 61 6c 75 65 20 2a 70 6e 43  n..** Value *pnC
221f0 75 72 72 65 6e 74 20 69 73 20 73 65 74 20 74 6f  urrent is set to
22200 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
22210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
22220 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  fore this .** fu
22230 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
22240 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
22250 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
22260 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
22270 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
22280 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
22290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
222a0 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e  btreeRelocateRan
222b0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
222c0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
222d0 20 20 20 20 20 20 2f 2a 20 42 2d 74 72 65 65 20        /* B-tree 
222e0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
222f0 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20   iFirst,        
22300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22310 69 72 73 74 20 70 61 67 65 20 74 6f 20 72 65 6c  irst page to rel
22320 6f 63 61 74 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  ocate */.  Pgno 
22330 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  iLast,          
22340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
22350 73 74 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63  st page to reloc
22360 61 74 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ate */.  Pgno *p
22370 6e 43 75 72 72 65 6e 74 20 20 20 20 20 20 20 20  nCurrent        
22380 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
22390 6f 74 20 4e 55 4c 4c 2c 20 49 4e 2f 4f 55 54 3a  ot NULL, IN/OUT:
223a0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   Database size *
223b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
223c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72  SQLITE_OK;.  Btr
223d0 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d  eePtrmap *pMap =
223e0 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67   pBt->pMap;.  Pg
223f0 6e 6f 20 69 50 67 3b 0a 0a 20 20 66 6f 72 28 69  no iPg;..  for(i
22400 50 67 3d 69 46 69 72 73 74 3b 20 69 50 67 3c 3d  Pg=iFirst; iPg<=
22410 69 4c 61 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  iLast && rc==SQL
22420 49 54 45 5f 4f 4b 3b 20 69 50 67 2b 2b 29 7b 0a  ITE_OK; iPg++){.
22430 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
22440 65 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50  ee = 0;     /* P
22450 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 72  age allocated fr
22460 6f 6d 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  om free-list */.
22470 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
22480 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69   = 0;.    Pgno i
22490 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
224a0 20 20 2f 2a 20 4e 65 77 20 70 61 67 65 20 6e 75    /* New page nu
224b0 6d 62 65 72 20 66 6f 72 20 70 50 67 20 2a 2f 0a  mber for pPg */.
224c0 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
224d0 2a 70 45 6e 74 72 79 3b 20 20 20 20 2f 2a 20 50  *pEntry;    /* P
224e0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
224f0 20 66 6f 72 20 70 61 67 65 20 69 50 67 20 2a 2f   for page iPg */
22500 0a 0a 20 20 20 20 69 66 28 20 69 50 67 3d 3d 50  ..    if( iPg==P
22510 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
22520 28 70 42 74 29 20 29 20 63 6f 6e 74 69 6e 75 65  (pBt) ) continue
22530 3b 0a 20 20 20 20 70 45 6e 74 72 79 20 3d 20 26  ;.    pEntry = &
22540 70 4d 61 70 2d 3e 61 50 74 72 5b 69 50 67 20 2d  pMap->aPtr[iPg -
22550 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 5d 3b 0a   pMap->iFirst];.
22560 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d  .    if( pEntry-
22570 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46  >eType==PTRMAP_F
22580 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
22590 20 50 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20   Pgno dummy;.   
225a0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
225b0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
225c0 70 46 72 65 65 2c 20 26 64 75 6d 6d 79 2c 20 69  pFree, &dummy, i
225d0 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43  Pg, BTALLOC_EXAC
225e0 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  T);.      if( pF
225f0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ree ){.        a
22600 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
22610 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
22620 70 46 72 65 65 2d 3e 70 44 62 50 61 67 65 29 3d  pFree->pDbPage)=
22630 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =1 );.        sq
22640 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
22650 70 46 72 65 65 2d 3e 70 44 62 50 61 67 65 29 3b  pFree->pDbPage);
22660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
22670 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22680 45 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69  E_OK || dummy==i
22690 50 67 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Pg );.    }else 
226a0 69 66 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b  if( pnCurrent ){
226b0 0a 20 20 20 20 20 20 62 74 72 65 65 47 65 74 50  .      btreeGetP
226c0 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70  age(pBt, iPg, &p
226d0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  Pg, 0);.      as
226e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
226f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
22700 67 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  g->pDbPage) );. 
22710 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
22720 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
22730 63 6f 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61  count(pPg->pDbPa
22740 67 65 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ge)==1 );.      
22750 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72  iNew = ++(*pnCur
22760 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rent);.      if(
22770 20 69 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42   iNew==PENDING_B
22780 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
22790 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72  iNew = ++(*pnCur
227a0 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  rent);.      rc 
227b0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
227c0 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d  Bt, pPg, pEntry-
227d0 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e  >eType, pEntry->
227e0 70 61 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29  parent, iNew, 1)
227f0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
22800 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  ageNotNull(pPg);
22810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22820 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
22830 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
22840 46 72 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69  Free, &iNew, iFi
22850 72 73 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c  rst-1, BTALLOC_L
22860 45 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  E);.      assert
22870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22880 7c 7c 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29  || iNew<iFirst )
22890 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
228a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
228b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
228c0 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  (pFree);.       
228d0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
228e0 74 2c 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29  t, iPg, &pPg, 0)
228f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ;.        rc = r
22900 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
22910 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54   pPg, pEntry->eT
22920 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72  ype, pEntry->par
22930 65 6e 74 2c 69 4e 65 77 2c 31 29 3b 0a 20 20 20  ent,iNew,1);.   
22940 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
22950 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
22960 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22970 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66  n rc;.}../* !def
22980 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
22990 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a  _CONCURRENT).**.
229a0 2a 2a 20 54 68 65 20 62 2d 74 72 65 65 20 68 61  ** The b-tree ha
229b0 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
229c0 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
229d0 20 69 73 20 61 62 6f 75 74 20 74 6f 20 63 6f 6d   is about to com
229e0 6d 69 74 20 61 6e 0a 2a 2a 20 43 4f 4e 43 55 52  mit an.** CONCUR
229f0 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e  RENT transaction
22a00 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
22a10 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
22a20 20 74 68 61 74 20 74 68 69 73 20 69 73 20 0a 2a   that this is .*
22a30 2a 20 70 6f 73 73 69 62 6c 65 20 2d 20 74 68 65  * possible - the
22a40 20 77 61 6c 20 57 52 49 54 45 52 20 6c 6f 63 6b   wal WRITER lock
22a50 20 69 73 20 68 65 6c 64 20 61 6e 64 20 69 74 20   is held and it 
22a60 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  is known that th
22a70 65 72 65 20 61 72 65 20 0a 2a 2a 20 6e 6f 20 63  ere are .** no c
22a80 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 63 6f  onflicts with co
22a90 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
22aa0 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
22ab0 69 6e 74 20 62 74 72 65 65 46 69 78 55 6e 6c 6f  int btreeFixUnlo
22ac0 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  cked(Btree *p){.
22ad0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
22ae0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
22af0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
22b00 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 75 38 20  t->pPage1;.  u8 
22b10 2a 70 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  *p1 = pPage1->aD
22b20 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
22b30 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
22b40 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
22b50 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
22b60 49 66 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  If page 1 of the
22b70 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
22b80 20 77 72 69 74 61 62 6c 65 2c 20 74 68 65 6e 20   writable, then 
22b90 6e 6f 20 70 61 67 65 73 20 77 65 72 65 20 61 6c  no pages were al
22ba0 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6f 72 20  located.  ** or 
22bb0 66 72 65 65 64 20 62 79 20 74 68 69 73 20 74 72  freed by this tr
22bc0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
22bd0 69 73 20 63 61 73 65 20 6e 6f 20 73 70 65 63 69  is case no speci
22be0 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 0a  al handling is .
22bf0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 4f    ** required. O
22c00 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 61 67  therwise, if pag
22c10 65 20 31 20 69 73 20 64 69 72 74 79 2c 20 70 72  e 1 is dirty, pr
22c20 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 42 74 72  oceed.  */.  Btr
22c30 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d  eePtrmap *pMap =
22c40 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67   pBt->pMap;.  Pg
22c50 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34  no iTrunk = get4
22c60 62 79 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20  byte(&p1[32]);. 
22c70 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 62 74   Pgno nPage = bt
22c80 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
22c90 29 3b 0a 20 20 75 33 32 20 6e 46 72 65 65 20 3d  );.  u32 nFree =
22ca0 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 36   get4byte(&p1[36
22cb0 5d 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ]);..  assert( p
22cc0 42 74 2d 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63  Bt->pMap );.  rc
22cd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 55   = sqlite3PagerU
22ce0 70 67 72 61 64 65 53 6e 61 70 73 68 6f 74 28 70  pgradeSnapshot(p
22cf0 50 61 67 65 72 2c 20 70 50 61 67 65 31 2d 3e 70  Pager, pPage1->p
22d00 44 62 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72  DbPage);.  asser
22d10 74 28 20 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61  t( p1==pPage1->a
22d20 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 72  Data );..  if( r
22d30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22d40 20 20 20 20 50 67 6e 6f 20 6e 48 50 61 67 65 20      Pgno nHPage 
22d50 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 32  = get4byte(&p1[2
22d60 38 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  8]);.    Pgno nF
22d70 69 6e 20 3d 20 6e 48 50 61 67 65 3b 20 20 20 20  in = nHPage;    
22d80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22d90 64 62 20 61 66 74 65 72 20 74 72 61 6e 73 61 63  db after transac
22da0 74 69 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a 20  tion merge */.. 
22db0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
22dc0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
22dd0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
22de0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 48  ){.      Pgno iH
22df0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
22e00 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20  (&p1[32]);.     
22e10 20 75 33 32 20 6e 48 46 72 65 65 20 3d 20 67 65   u32 nHFree = ge
22e20 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b  t4byte(&p1[36]);
22e30 0a 0a 20 20 20 20 20 20 62 74 72 65 65 50 74 72  ..      btreePtr
22e40 6d 61 70 43 68 65 63 6b 28 70 42 74 2c 20 6e 50  mapCheck(pBt, nP
22e50 61 67 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  age);..      /* 
22e60 41 74 74 61 63 68 20 74 68 65 20 68 65 61 64 20  Attach the head 
22e70 64 61 74 61 62 61 73 65 20 66 72 65 65 20 6c 69  database free li
22e80 73 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  st to the end of
22e90 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
22ea0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
22eb0 6e 73 20 66 72 65 65 2d 6c 69 73 74 20 28 69 66  ns free-list (if
22ec0 20 61 6e 79 29 2e 20 20 2a 2f 0a 20 20 20 20 20   any).  */.     
22ed0 20 69 66 28 20 69 54 72 75 6e 6b 21 3d 30 20 29   if( iTrunk!=0 )
22ee0 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
22ef0 74 65 28 26 70 31 5b 33 36 5d 2c 20 6e 48 46 72  te(&p1[36], nHFr
22f00 65 65 20 2b 20 6e 46 72 65 65 29 3b 0a 20 20 20  ee + nFree);.   
22f10 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
22f20 31 5b 33 32 5d 2c 20 69 54 72 75 6e 6b 29 3b 0a  1[32], iTrunk);.
22f30 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
22f40 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
22f50 20 20 20 44 62 50 61 67 65 20 2a 70 54 72 75 6e     DbPage *pTrun
22f60 6b 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  k = sqlite3Pager
22f70 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69  Lookup(pPager, i
22f80 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
22f90 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
22fa0 79 74 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d  yte((u8*)pTrunk-
22fb0 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >pData);.       
22fc0 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3d 3d 30     if( iTrunk==0
22fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22fe0 70 75 74 34 62 79 74 65 28 28 75 38 2a 29 70 54  put4byte((u8*)pT
22ff0 72 75 6e 6b 2d 3e 70 44 61 74 61 2c 20 69 48 54  runk->pData, iHT
23000 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
23010 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
23020 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
23030 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
23040 7d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  };.      }..    
23050 20 20 69 66 28 20 6e 48 50 61 67 65 3c 28 70 4d    if( nHPage<(pM
23060 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 29 7b  ap->iFirst-1) ){
23070 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
23080 64 61 74 61 62 61 73 65 20 63 6f 6e 73 69 73 74  database consist
23090 65 64 20 6f 66 20 28 70 4d 61 70 2d 3e 69 46 69  ed of (pMap->iFi
230a0 72 73 74 2d 31 29 20 70 61 67 65 73 20 77 68 65  rst-1) pages whe
230b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  n the current.  
230c0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 75 72 72        ** concurr
230d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
230e0 77 61 73 20 6f 70 65 6e 65 64 2e 20 41 6e 64 20  was opened. And 
230f0 61 6e 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72  an concurrent tr
23100 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 0a 20 20  ansaction may.  
23110 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20        ** not be 
23120 65 78 65 63 75 74 65 64 20 6f 6e 20 61 6e 20 61  executed on an a
23130 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
23140 61 73 65 20 2d 20 73 6f 20 74 68 65 20 64 62 20  ase - so the db 
23150 73 68 6f 75 6c 64 20 0a 20 20 20 20 20 20 20 20  should .        
23160 2a 2a 20 6e 6f 74 20 68 61 76 65 20 73 68 72 75  ** not have shru
23170 6e 6b 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  nk since the tra
23180 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
23190 6e 65 64 2e 20 54 68 65 72 65 66 6f 72 65 20 6e  ned. Therefore n
231a0 48 50 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  HPage.        **
231b0 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74   should be set t
231c0 6f 20 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d  o (pMap->iFirst-
231d0 31 29 20 6f 72 20 67 72 65 61 74 65 72 2e 20 2a  1) or greater. *
231e0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
231f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23200 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
23210 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
23220 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
23230 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  ion allocated pa
23240 67 65 73 20 70 4d 61 70 2d 3e 69 46 69 72 73 74  ges pMap->iFirst
23250 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20 20 20   through.       
23260 20 2a 2a 20 6e 50 61 67 65 20 28 69 6e 63 6c 75   ** nPage (inclu
23270 73 69 76 65 29 20 61 74 20 74 68 65 20 65 6e 64  sive) at the end
23280 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23290 20 66 69 6c 65 2e 20 4d 65 61 6e 77 68 69 6c 65   file. Meanwhile
232a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68  ,.        ** oth
232b0 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  er transactions 
232c0 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 28  have allocated (
232d0 69 46 69 72 73 74 2e 2e 6e 48 50 61 67 65 29 2e  iFirst..nHPage).
232e0 20 53 6f 20 6d 6f 76 65 0a 20 20 20 20 20 20 20   So move.       
232f0 20 2a 2a 20 70 61 67 65 73 20 28 69 46 69 72 73   ** pages (iFirs
23300 74 2e 2e 4d 49 4e 28 6e 50 61 67 65 2c 6e 48 50  t..MIN(nPage,nHP
23310 61 67 65 29 29 20 74 6f 20 28 4d 41 58 28 6e 50  age)) to (MAX(nP
23320 61 67 65 2c 6e 48 50 61 67 65 29 2b 31 29 2e 20  age,nHPage)+1). 
23330 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
23340 69 4c 61 73 74 20 3d 20 4d 49 4e 28 6e 50 61 67  iLast = MIN(nPag
23350 65 2c 20 6e 48 50 61 67 65 29 3b 20 20 20 20 2f  e, nHPage);    /
23360 2a 20 4c 61 73 74 20 70 61 67 65 20 74 6f 20 6d  * Last page to m
23370 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 50  ove */.        P
23380 67 6e 6f 20 6e 43 75 72 72 65 6e 74 3b 20 20 20  gno nCurrent;   
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
233b0 7a 65 20 6f 66 20 64 62 20 2a 2f 0a 0a 20 20 20  ze of db */..   
233c0 20 20 20 20 20 6e 43 75 72 72 65 6e 74 20 3d 20       nCurrent = 
233d0 4d 41 58 28 6e 50 61 67 65 2c 20 6e 48 50 61 67  MAX(nPage, nHPag
233e0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  e);.        pBt-
233f0 3e 6e 50 61 67 65 20 3d 20 6e 43 75 72 72 65 6e  >nPage = nCurren
23400 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
23410 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e  btreeRelocateRan
23420 67 65 28 70 42 74 2c 20 70 4d 61 70 2d 3e 69 46  ge(pBt, pMap->iF
23430 69 72 73 74 2c 20 69 4c 61 73 74 2c 20 26 6e 43  irst, iLast, &nC
23440 75 72 72 65 6e 74 29 3b 0a 0a 20 20 20 20 20 20  urrent);..      
23450 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
23460 6f 77 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 73  ow no collisions
23470 20 77 69 74 68 20 74 68 65 20 73 6e 61 70 73 68   with the snapsh
23480 6f 74 20 61 74 20 74 68 65 20 68 65 61 64 20 6f  ot at the head o
23490 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
234a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
234b0 53 6f 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  So at this point
234c0 20 69 74 20 77 6f 75 6c 64 20 62 65 20 70 6f 73   it would be pos
234d0 73 69 62 6c 65 20 74 6f 20 77 72 69 74 65 0a 20  sible to write. 
234e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72         ** the tr
234f0 61 6e 73 61 63 74 69 6f 6e 20 6f 75 74 20 74 6f  ansaction out to
23500 20 64 69 73 6b 2e 20 42 65 66 6f 72 65 20 64 6f   disk. Before do
23510 69 6e 67 20 73 6f 20 74 68 6f 75 67 68 2c 20 61  ing so though, a
23520 74 74 65 6d 70 74 20 74 6f 0a 20 20 20 20 20 20  ttempt to.      
23530 20 20 2a 2a 20 72 65 6c 6f 63 61 74 65 20 73 6f    ** relocate so
23540 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 70 61  me of the new pa
23550 67 65 73 20 74 6f 20 66 72 65 65 20 6c 6f 63 61  ges to free loca
23560 74 69 6f 6e 73 20 77 69 74 68 69 6e 20 74 68 65  tions within the
23570 20 62 6f 64 79 0a 20 20 20 20 20 20 20 20 2a 2a   body.        **
23580 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23590 20 66 69 6c 65 20 28 69 2e 65 2e 20 66 72 65 65   file (i.e. free
235a0 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 29 2e 20  -list entries). 
235b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
235c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
235d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
235e0 28 20 6e 43 75 72 72 65 6e 74 21 3d 50 45 4e 44  ( nCurrent!=PEND
235f0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
23600 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
23610 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44  sqlite3PagerSetD
23620 62 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  bsize(pBt->pPage
23630 72 2c 20 6e 43 75 72 72 65 6e 74 29 3b 0a 20 20  r, nCurrent);.  
23640 20 20 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20          nFree = 
23650 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d  get4byte(&p1[36]
23660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69  );.          nFi
23670 6e 20 3d 20 6e 43 75 72 72 65 6e 74 2d 6e 46 72  n = nCurrent-nFr
23680 65 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ee;.          if
23690 28 20 6e 43 75 72 72 65 6e 74 3e 50 45 4e 44 49  ( nCurrent>PENDI
236a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
236b0 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49  ) && nFin<=PENDI
236c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
236d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
236e0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 20   nFin--;.       
236f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e     }.          n
23700 46 69 6e 20 3d 20 4d 41 58 28 6e 46 69 6e 2c 20  Fin = MAX(nFin, 
23710 6e 48 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  nHPage);.       
23720 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c     rc = btreeRel
23730 6f 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20  ocateRange(pBt, 
23740 6e 46 69 6e 2b 31 2c 20 6e 43 75 72 72 65 6e 74  nFin+1, nCurrent
23750 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
23760 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
23770 65 28 26 70 31 5b 32 38 5d 2c 20 6e 46 69 6e 29  e(&p1[28], nFin)
23780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23790 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
237a0 53 65 74 44 62 73 69 7a 65 28 70 50 61 67 65 72  SetDbsize(pPager
237b0 2c 20 6e 46 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20  , nFin);.  }..  
237c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
237d0 73 65 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65  se.# define btre
237e0 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 58 29 20  eFixUnlocked(X) 
237f0 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
23800 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
23810 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a  _CONCURRENT */..
23820 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
23830 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
23840 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
23850 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
23860 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
23870 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
23880 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
23890 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
238a0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
238b0 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
238c0 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
238d0 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
238e0 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
238f0 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
23900 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
23910 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
23920 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
23930 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
23940 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
23950 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
23960 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
23970 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
23980 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
23990 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
239a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
239b0 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
239c0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
239d0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
239e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
239f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
23a00 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
23a10 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
23a20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
23a30 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
23a40 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
23a50 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
23a60 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
23a70 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
23a80 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
23a90 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
23aa0 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
23ab0 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
23ac0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
23ad0 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
23ae0 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
23af0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
23b00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
23b10 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
23b20 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
23b30 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
23b40 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
23b50 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
23b60 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
23b70 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
23b80 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
23b90 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
23ba0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
23bb0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
23bc0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
23bd0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
23be0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
23bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
23c00 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
23c10 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
23c20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
23c30 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
23c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
23c50 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
23c60 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
23c70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
23c80 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
23c90 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
23ca0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
23cb0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
23cc0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
23cd0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
23ce0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
23cf0 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
23d00 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
23d10 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
23d20 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
23d30 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
23d40 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
23d50 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
23d60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
23d70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23d80 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
23d90 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
23da0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
23db0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23dc0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
23dd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
23de0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
23df0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
23e00 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
23e10 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23  treeEnter(p);..#
23e20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23e30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
23e40 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
23e50 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 61  acuum ){.      a
23e60 73 73 65 72 74 28 20 49 53 43 4f 4e 43 55 52 52  ssert( ISCONCURR
23e70 45 4e 54 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ENT==0 );.      
23e80 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
23e90 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
23ea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
23ec0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
23ed0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
23ee0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
23ef0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
23f00 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
23f10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
23f20 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
23f30 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
23f40 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
23f50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
23f60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23f70 26 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29  & ISCONCURRENT )
23f80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
23f90 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 70 29  eeFixUnlocked(p)
23fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23fc0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23fd0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
23fe0 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
23ff0 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
24000 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24010 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
24020 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24040 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24050 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
24060 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
24070 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
24080 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
24090 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
240a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
240b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
240c0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
240d0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
240e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
240f0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
24100 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
24110 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
24120 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
24130 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
24140 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24150 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
24160 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
24170 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
24180 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
24190 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
241a0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
241b0 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
241c0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
241d0 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
241e0 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
241f0 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
24200 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
24210 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
24220 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
24230 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
24240 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
24250 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
24260 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
24270 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
24280 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
24290 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
242a0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
242b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
242c0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
242d0 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
242e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
242f0 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
24300 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
24310 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
24320 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
24330 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
24340 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
24350 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
24360 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
24370 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
24380 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
24390 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
243a0 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
243b0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
243c0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
243d0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
243e0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
243f0 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
24400 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
24410 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
24420 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
24430 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
24440 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
24450 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
24460 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
24470 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
24480 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
24490 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
244a0 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
244b0 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
244c0 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
244d0 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
244e0 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
244f0 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
24500 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
24510 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
24520 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
24530 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
24540 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
24550 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
24560 73 20 77 61 73 20 61 6e 20 43 4f 4e 43 55 52 52  s was an CONCURR
24570 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ENT transaction,
24580 20 64 65 6c 65 74 65 20 74 68 65 20 70 42 74 2d   delete the pBt-
24590 3e 70 4d 61 70 20 6f 62 6a 65 63 74 2e 0a 20 20  >pMap object..  
245a0 2a 2a 20 41 6c 73 6f 20 63 61 6c 6c 20 50 61 67  ** Also call Pag
245b0 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28  erEndConcurrent(
245c0 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
245d0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 64   the pager has d
245e0 69 73 63 61 72 64 65 64 0a 20 20 2a 2a 20 74 68  iscarded.  ** th
245f0 65 20 72 65 63 6f 72 64 20 6f 66 20 61 6c 6c 20  e record of all 
24600 70 61 67 65 73 20 72 65 61 64 20 77 69 74 68 69  pages read withi
24610 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
24620 6e 2e 20 20 2a 2f 0a 20 20 62 74 72 65 65 50 74  n.  */.  btreePt
24630 72 6d 61 70 44 65 6c 65 74 65 28 70 42 74 29 3b  rmapDelete(pBt);
24640 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  .  sqlite3PagerE
24650 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74  ndConcurrent(pBt
24660 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 62 74 72  ->pPager);.  btr
24670 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
24680 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
24690 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
246a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
246b0 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
246c0 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
246d0 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
246e0 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
246f0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
24700 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
24710 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
24720 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
24730 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
24740 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
24750 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
24760 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
24770 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
24780 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
24790 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
247a0 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
247b0 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
247c0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
247d0 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
247e0 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
247f0 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
24800 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
24810 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
24820 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
24830 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
24840 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
24850 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
24860 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
24870 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
24880 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
24890 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
248a0 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
248b0 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
248c0 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
248d0 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
248e0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
248f0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
24900 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
24910 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
24920 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
24930 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
24940 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
24950 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
24960 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
24970 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
24980 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
24990 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
249a0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
249b0 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
249c0 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
249d0 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
249e0 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
249f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
24a00 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
24a10 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
24a20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
24a30 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
24a40 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
24a50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
24a60 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
24a70 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
24a80 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
24a90 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
24aa0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
24ab0 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
24ac0 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
24ad0 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
24ae0 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
24af0 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
24b00 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
24b10 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
24b20 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
24b30 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
24b40 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
24b50 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
24b60 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
24b70 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
24b80 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
24b90 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
24ba0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
24bb0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
24bc0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
24bd0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
24be0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
24bf0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
24c00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24c10 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
24c20 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
24c30 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
24c40 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
24c50 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
24c60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
24c70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
24c80 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
24c90 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
24ca0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
24cb0 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
24cc0 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
24cd0 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
24ce0 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
24cf0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
24d00 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
24d10 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
24d20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
24d30 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
24d40 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
24d50 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
24d60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
24d70 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
24d80 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
24d90 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
24da0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
24db0 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
24dc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24dd0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
24de0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
24df0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24e00 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
24e10 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
24e20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
24e30 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
24e40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
24e50 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d  p->iDataVersion-
24e60 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74  -;  /* Compensat
24e70 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44  e for pPager->iD
24e80 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f  ataVersion++; */
24e90 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
24ea0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
24eb0 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
24ec0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
24ed0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
24ee0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
24ef0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
24f00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
24f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24f20 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
24f30 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
24f40 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
24f50 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
24f60 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
24f70 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
24f80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
24f90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
24fa0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
24fb0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
24fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24fd0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
24fe0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
24ff0 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
25000 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
25010 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25020 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
25030 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
25040 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
25050 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
25060 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
25070 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
25080 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74  cursor on any Bt
25090 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
250a0 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
250b0 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69  .  Or if the wri
250c0 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73  teOnly flag is s
250d0 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e  et to 1, then on
250e0 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65  ly.** trip write
250f0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61   cursors and lea
25100 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ve read cursors 
25110 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
25120 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
25130 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
25140 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  be tripped, incl
25150 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a  uding cursors.**
25160 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
25170 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
25180 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
25190 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20  happen to be.** 
251a0 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68  sharing the cach
251b0 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
251c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
251d0 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
251e0 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
251f0 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69  curs. If the wri
25200 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69  teOnly.** flag i
25210 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c  s true, then onl
25220 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  y write-cursors 
25230 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20  need be tripped 
25240 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  - read-only.** c
25250 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69  ursors save thei
25260 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  r current positi
25270 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ons so that they
25280 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a   may continue .*
25290 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
252a0 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66  rollback. Or, if
252b0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
252c0 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  lse, all cursors
252d0 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64   are .** tripped
252e0 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72  . In general, wr
252f0 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
25300 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
25310 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c  ion being.** rol
25320 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65  led back modifie
25330 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
25340 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63  chema. In this c
25350 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a  ase b-tree root.
25360 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20  ** pages may be 
25370 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64  moved or deleted
25380 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25390 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d  se altogether, m
253a0 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61  aking.** it unsa
253b0 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73  fe for read curs
253c0 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ors to continue.
253d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72  .**.** If the wr
253e0 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
253f0 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f  true and an erro
25400 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
25410 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e   while .** savin
25420 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
25430 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64  sition of a read
25440 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c  -only cursor, al
25450 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69  l cursors, .** i
25460 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61  ncluding all rea
25470 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  d-cursors are tr
25480 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ipped..**.** SQL
25490 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
254a0 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
254b0 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
254c0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a   occurs while.**
254d0 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72   saving a cursor
254e0 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51   position, an SQ
254f0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
25500 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25510 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
25520 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
25530 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69  , int errCode, i
25540 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
25550 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
25560 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25570 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  OK;..  assert( (
25580 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  writeOnly==0 || 
25590 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26  writeOnly==1) &&
255a0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d   BTCF_WriteFlag=
255b0 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72  =1 );.  if( pBtr
255c0 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
255d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
255e0 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ee);.    for(p=p
255f0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
25600 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
25610 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  xt){.      if( w
25620 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e  riteOnly && (p->
25630 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
25640 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b  WriteFlag)==0 ){
25650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
25660 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25670 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74  ALID || p->eStat
25680 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
25690 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
256a0 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
256b0 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
256c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
256d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
256e0 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
256f0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
25700 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20  Cursors(pBtree, 
25710 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rc, 0);.        
25720 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25740 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25750 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
25760 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
25770 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  ;.        p->eSt
25780 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
25790 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  LT;.        p->s
257a0 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64  kipNext = errCod
257b0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
257c0 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
257d0 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a  CursorPages(p);.
257e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
257f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
25800 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
25810 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
25820 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
25830 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
25840 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72  ess..**.** If tr
25850 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
25860 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72  LITE_OK then cur
25870 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76  sors will be inv
25880 61 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65  alidated (trippe
25890 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  d)..** Only writ
258a0 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  e cursors are tr
258b0 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e  ipped if writeOn
258c0 6c 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61  ly is true but a
258d0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a  ll cursors are.*
258e0 2a 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  * tripped if wri
258f0 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e  teOnly is false.
25900 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
25910 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65   use.** a trippe
25920 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65  d cursor will re
25930 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
25940 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
25950 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
25960 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
25970 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
25980 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
25990 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
259a0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
259b0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
259c0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
259d0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
259e0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69  tree *p, int tri
259f0 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  pCode, int write
25a00 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
25a10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
25a20 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
25a30 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
25a40 20 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e   assert( writeOn
25a50 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==1 || writeOn
25a60 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
25a70 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  t( tripCode==SQL
25a80 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
25a90 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d  CK || tripCode==
25aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
25ab0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
25ac0 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
25ad0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
25ae0 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
25af0 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
25b00 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
25b10 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72  .    if( rc ) wr
25b20 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d  iteOnly = 0;.  }
25b30 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
25b40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
25b50 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a  if( tripCode ){.
25b60 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71      int rc2 = sq
25b70 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
25b80 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70  lCursors(p, trip
25b90 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29  Code, writeOnly)
25ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
25bb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
25bc0 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20  writeOnly==0 && 
25bd0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  rc2==SQLITE_OK) 
25be0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
25bf0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
25c00 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65   rc2;.  }.  btre
25c10 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
25c20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
25c30 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
25c40 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
25c50 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
25c60 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
25c70 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
25c80 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
25c90 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
25ca0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
25cb0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
25cc0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
25cd0 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
25ce0 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
25cf0 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
25d00 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
25d10 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
25d20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
25d30 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
25d40 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
25d50 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
25d60 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
25d70 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
25d80 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
25d90 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
25da0 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
25db0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
25dc0 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62  nt nPage = get4b
25dd0 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
25de0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e1->aData);.    
25df0 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67    testcase( nPag
25e00 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
25e10 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
25e20 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
25e30 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
25e40 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74  &nPage);.      t
25e50 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50  estcase( pBt->nP
25e60 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20  age!=nPage );.  
25e70 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
25e80 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65   nPage;.      re
25e90 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61  leasePageOne(pPa
25ea0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
25eb0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
25ec0 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31  idCursors(pBt, 1
25ed0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
25ee0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
25ef0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
25f00 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
25f10 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
25f20 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
25f30 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
25f40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
25f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25f60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
25f70 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
25f80 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
25f90 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
25fa0 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
25fb0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
25fc0 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
25fd0 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
25fe0 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
25ff0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
26000 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
26010 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
26020 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
26030 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
26040 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
26050 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
26060 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
26070 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
26080 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
26090 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
260a0 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
260b0 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
260c0 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
260d0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
260e0 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
260f0 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
26100 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
26110 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
26120 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
26130 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
26140 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
26150 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
26160 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
26170 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
26180 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
26190 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
261a0 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
261b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
261c0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
261d0 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
261e0 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
261f0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
26200 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
26210 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
26220 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
26230 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
26240 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
26250 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
26260 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
26270 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
26280 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
26290 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
262a0 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
262b0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
262c0 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
262d0 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
262e0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
262f0 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
26300 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
26310 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
26320 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
26330 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
26340 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
26350 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
26360 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
26370 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
26380 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
26390 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
263a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
263b0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
263c0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
263d0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
263e0 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
263f0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
26400 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ONLY)==0 );.  as
26410 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
26420 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
26430 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
26440 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
26450 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
26460 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
26470 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
26480 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
26490 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
264a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
264b0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
264c0 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
264d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
264e0 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
264f0 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
26500 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
26510 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
26520 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
26530 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
26540 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
26550 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
26560 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
26570 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
26580 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
26590 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
265a0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
265b0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
265c0 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
265d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
265e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
265f0 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70 42 65   = btreePtrmapBe
26600 67 69 6e 28 70 42 74 2c 20 69 53 74 61 74 65 6d  gin(pBt, iStatem
26610 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
26620 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
26630 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26640 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
26650 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
26660 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
26670 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
26680 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
26690 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
266a0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
266b0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
266c0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
266d0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
266e0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
266f0 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
26700 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
26710 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
26720 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
26730 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
26740 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
26750 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
26760 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
26770 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
26780 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
26790 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
267a0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
267b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
267c0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
267d0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
267e0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
267f0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
26800 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
26810 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
26820 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
26830 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
26840 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
26850 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
26860 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
26870 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
26880 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
26890 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
268a0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
268b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
268c0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
268d0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
268e0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
268f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
26900 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
26910 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
26920 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
26930 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
26940 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
26950 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
26960 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
26970 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
26980 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
26990 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
269a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
269b0 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e 64 28   btreePtrmapEnd(
269c0 70 42 74 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  pBt, op, iSavepo
269d0 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 6f 70  int);.    if( op
269e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
269f0 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  BACK ){.      rc
26a00 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
26a10 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
26a20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
26a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26a40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26a50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
26a60 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
26a70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
26a80 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
26a90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26aa0 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
26ab0 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 && (pBt->btsFl
26ac0 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41  ags & BTS_INITIA
26ad0 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b  LLY_EMPTY)!=0 ){
26ae0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  .        pBt->nP
26af0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  age = 0;.      }
26b00 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
26b10 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
26b20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
26b30 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70   get4byte(28 + p
26b40 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
26b50 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  a);..      /* Th
26b60 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
26b70 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
26b80 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f   the offset 28 o
26b90 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20  f the header.   
26ba0 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74     ** when the t
26bb0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
26bc0 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74  ed, so we know t
26bd0 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74  hat the value at
26be0 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a   offset.      **
26bf0 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20   28 is nonzero. 
26c00 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
26c10 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b   pBt->nPage>0 );
26c20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
26c30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
26c40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
26c60 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
26c70 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
26c80 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
26c90 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
26ca0 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
26cb0 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
26cc0 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
26cd0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
26ce0 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
26cf0 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
26d00 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
26d10 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
26d20 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
26d30 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
26d40 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
26d50 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
26d60 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
26d70 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
26d80 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
26d90 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
26da0 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62  he BTREE_WRCSR b
26db0 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20  it of wrFlag is 
26dc0 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20  clear, then the 
26dd0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a  cursor can only.
26de0 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ** be used for r
26df0 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20  eading.  If the 
26e00 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
26e10 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
26e20 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62   cursor.** can b
26e30 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
26e40 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e  ng or for writin
26e50 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
26e60 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
26e70 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65  g.** are also me
26e80 74 2e 20 20 54 68 65 73 65 20 61 72 65 20 74 68  t.  These are th
26e90 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
26ea0 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
26eb0 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72   order.** for wr
26ec0 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f  iting to be allo
26ed0 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
26ee0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
26ef0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
26f00 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74  with wrFlag cont
26f10 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43  aining BTREE_WRC
26f20 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  SR.**.** 2:  Oth
26f30 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
26f40 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
26f50 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
26f60 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
26f70 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
26f80 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
26f90 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
26fa0 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
26fb0 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
26fc0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
26fd0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
26fe0 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
26ff0 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
27000 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
27010 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
27020 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
27030 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
27040 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
27050 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
27060 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
27070 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
27080 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
27090 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
270a0 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
270b0 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
270c0 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
270d0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  action..**.** Th
270e0 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  e BTREE_FORDELET
270f0 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20  E bit of wrFlag 
27100 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62  may optionally b
27110 65 20 73 65 74 20 69 66 20 42 54 52 45 45 5f 57  e set if BTREE_W
27120 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20  RCSR.** is set. 
27130 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73   If FORDELETE is
27140 20 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20   set, that is a 
27150 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
27160 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a  ementation that.
27170 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  ** this cursor w
27180 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  ill only be used
27190 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20   to seek to and 
271a0 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f  delete entries o
271b0 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73  f an index.** as
271c0 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65   part of a large
271d0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
271e0 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45  nt.  The FORDELE
271f0 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75  TE hint is not u
27200 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69  sed by.** this i
27210 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
27220 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65  But in a hypothe
27230 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76  tical alternativ
27240 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  e storage engine
27250 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e   .** in which in
27260 64 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20  dex entries are 
27270 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
27280 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65  leted when corre
27290 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a  sponding table.*
272a0 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74  * rows are delet
272b0 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54  ed, the FORDELET
272c0 45 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74  E flag is a hint
272d0 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61   that all SEEK a
272e0 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65  nd DELETE.** ope
272f0 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20  rations on this 
27300 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f  cursor can be no
27310 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41  -ops and all REA
27320 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e  D operations can
27330 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75   .** return a nu
27340 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a  ll row (2-bytes:
27350 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a   0x01 0x00)..**.
27360 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
27370 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
27380 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
27390 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
273a0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
273b0 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
273c0 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
273d0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
273e0 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
273f0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
27400 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
27410 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
27420 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
27430 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
27440 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
27450 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
27460 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
27470 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
27480 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
27490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
274a0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
274b0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274d0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
274e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
274f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27510 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
27520 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
27530 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
27560 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
27570 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
27580 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
27590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
275a0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
275b0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
275c0 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
275d0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
275f0 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
27600 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
27610 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
27620 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
27630 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
27640 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
27650 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b  .  BtCursor *pX;
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
27680 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20  ping over other 
27690 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a  all cursors */..
276a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
276b0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
276c0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
276d0 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20   wrFlag==0 .    
276e0 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54     || wrFlag==BT
276f0 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20  REE_WRCSR .     
27700 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54    || wrFlag==(BT
27710 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f  REE_WRCSR|BTREE_
27720 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b  FORDELETE) .  );
27730 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
27740 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
27750 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
27760 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
27770 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
27780 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
27790 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
277a0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
277b0 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
277c0 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
277d0 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
277e0 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
277f0 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
27800 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
27810 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
27820 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
27830 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
27840 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
27850 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77   pKeyInfo!=0, (w
27860 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20  rFlag?2:1)) );. 
27870 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
27880 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
27890 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
278a0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
278b0 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
278c0 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
278d0 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
278e0 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
278f0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
27900 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
27910 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
27920 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
27930 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
27940 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
27950 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
27960 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
27970 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
27980 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46  =0 || (pBt->btsF
27990 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
279a0 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  ONLY)==0 );..  i
279b0 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
279c0 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
279d0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  ce(pBt);.    if(
279e0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d   pBt->pTmpSpace=
279f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
27a00 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
27a10 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
27a20 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
27a30 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
27a40 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c      assert( wrFl
27a50 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61  ag==0 );.    iTa
27a60 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ble = 0;.  }..  
27a70 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
27a80 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
27a90 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
27aa0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
27ab0 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
27ac0 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
27ad0 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
27ae0 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
27af0 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
27b00 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
27b10 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
27b20 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
27b30 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
27b40 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
27b50 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
27b60 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
27b70 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d  pCur->curFlags =
27b80 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57   wrFlag ? BTCF_W
27b90 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20  riteFlag : 0;.  
27ba0 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
27bb0 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30  ags = wrFlag ? 0
27bc0 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   : PAGER_GET_REA
27bd0 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74  DONLY;.  /* If t
27be0 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
27bf0 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
27c00 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
27c10 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20  then all such.  
27c20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74  ** cursors *must
27c30 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f  * have the BTCF_
27c40 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65  Multiple flag se
27c50 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70  t. */.  for(pX=p
27c60 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b  Bt->pCursor; pX;
27c70 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
27c80 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f      if( pX->pgno
27c90 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62  Root==(Pgno)iTab
27ca0 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e  le ){.      pX->
27cb0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
27cc0 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20  _Multiple;.     
27cd0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
27ce0 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
27cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
27d00 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
27d10 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d  >pCursor;.  pBt-
27d20 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
27d30 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
27d40 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
27d50 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
27d60 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
27d70 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
27d80 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27db0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
27dc0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27df0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
27e00 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
27e10 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
27e40 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
27e50 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
27e60 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
27e70 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
27e80 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
27e90 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
27ea0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
27eb0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ed0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
27ee0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
27ef0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
27f00 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20  ( iTable<1 ){.  
27f10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
27f20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
27f30 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
27f40 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
27f50 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72     rc = btreeCur
27f60 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
27f70 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
27f80 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69   pCur);.    sqli
27f90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
27fa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27fb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
27fc0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
27fd0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
27fe0 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
27ff0 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
28000 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
28010 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
28020 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
28030 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
28040 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
28050 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
28060 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
28070 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
28080 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
28090 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
280a0 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
280b0 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
280c0 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
280d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
280e0 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
280f0 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
28100 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
28110 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
28120 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
28130 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
28140 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
28150 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
28160 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
28170 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
28180 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
28190 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
281a0 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
281b0 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
281c0 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
281d0 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
281e0 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
281f0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
28200 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
28210 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
28220 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
28230 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
28240 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
28250 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
28260 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
28270 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
28280 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
28290 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
282a0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
282b0 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
282c0 72 2c 20 42 54 43 55 52 53 4f 52 5f 46 49 52 53  r, BTCURSOR_FIRS
282d0 54 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f  T_UNINIT));.}../
282e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
282f0 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
28300 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
28310 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
28320 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
28330 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
28340 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
28350 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
28360 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
28370 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
28380 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
28390 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
283a0 74 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68  tree ){.    BtSh
283b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
283c0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
283d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
283e0 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ree);.    assert
283f0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d  ( pBt->pCursor!=
28400 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  0 );.    if( pBt
28410 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20  ->pCursor==pCur 
28420 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  ){.      pBt->pC
28430 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
28440 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
28450 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a        BtCursor *
28460 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75  pPrev = pBt->pCu
28470 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a  rsor;.      do{.
28480 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
28490 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29  v->pNext==pCur )
284a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  {.          pPre
284b0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
284c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
284d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
284e0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
284f0 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b   = pPrev->pNext;
28500 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41  .      }while( A
28510 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a  LWAYS(pPrev) );.
28520 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 52      }.    btreeR
28530 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
28540 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20  ages(pCur);.    
28550 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
28560 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71  sed(pBt);.    sq
28570 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
28580 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >aOverflow);.   
28590 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
285a0 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73  ur->pKey);.    s
285b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
285c0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
285d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
285e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
285f0 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
28600 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
28610 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
28620 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
28630 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
28640 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
28650 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
28660 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
28670 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
28680 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
28690 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
286a0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
286b0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
286c0 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
286d0 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
286e0 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
286f0 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
28700 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
28710 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
28720 42 55 47 0a 20 20 73 74 61 74 69 63 20 69 6e 74  BUG.  static int
28730 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43   cellInfoEqual(C
28740 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c  ellInfo *a, Cell
28750 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66  Info *b){.    if
28760 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b  ( a->nKey!=b->nK
28770 65 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ey ) return 0;. 
28780 20 20 20 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f     if( a->pPaylo
28790 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20  ad!=b->pPayload 
287a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
287b0 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21  if( a->nPayload!
287c0 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72  =b->nPayload ) r
287d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
287e0 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e   a->nLocal!=b->n
287f0 4c 6f 63 61 6c 20 29 20 72 65 74 75 72 6e 20 30  Local ) return 0
28800 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 53 69  ;.    if( a->nSi
28810 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72  ze!=b->nSize ) r
28820 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
28830 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61  urn 1;.  }.  sta
28840 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
28850 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
28860 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
28870 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
28880 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
28890 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
288a0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
288b0 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
288c0 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29  pCur->ix, &info)
288d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  ;.    assert( CO
288e0 52 52 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c  RRUPT_DB || cell
288f0 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c  InfoEqual(&info,
28900 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b   &pCur->info) );
28910 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
28920 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
28930 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74  nfo(x).#endif.st
28940 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
28950 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c  LINE void getCel
28960 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
28970 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75  pCur){.  if( pCu
28980 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
28990 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   ){.    pCur->cu
289a0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
289b0 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74  alidNKey;.    bt
289c0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
289d0 72 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e 69  r->pPage,pCur->i
289e0 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  x,&pCur->info);.
289f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
28a00 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
28a10 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
28a20 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
28a30 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
28a40 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
28a50 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
28a60 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
28a70 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
28a80 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
28a90 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
28aa0 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
28ab0 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
28ac0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
28ad0 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
28ae0 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
28af0 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
28b00 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
28b10 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
28b20 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
28b30 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
28b40 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
28b50 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
28b60 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
28b70 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
28b80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28b90 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
28ba0 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e   /* NDEBUG */.in
28bb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
28bc0 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74  rsorIsValidNN(Bt
28bd0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
28be0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
28bf0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75   );.  return pCu
28c00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28c10 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  R_VALID;.}../*.*
28c20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
28c30 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
28c40 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22  r key or "rowid"
28c50 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72   for a table btr
28c60 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ee..** This rout
28c70 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ine is only vali
28c80 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
28c90 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  hat is pointing 
28ca0 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61  into a.** ordina
28cb0 72 79 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20  ry table btree. 
28cc0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 70   If the cursor p
28cd0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65  oints to an inde
28ce0 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73  x btree or.** is
28cf0 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65   invalid, the re
28d00 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75  sult of this rou
28d10 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65  tine is undefine
28d20 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  d..*/.i64 sqlite
28d30 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79  3BtreeIntegerKey
28d40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
28d50 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
28d60 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
28d70 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28d80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28d90 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
28da0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
28db0 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74  rIntKey );.  get
28dc0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
28dd0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69    return pCur->i
28de0 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66  nfo.nKey;.}..#if
28df0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
28e00 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e  E_OFFSET_SQL_FUN
28e10 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  C./*.** Return t
28e20 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74  he offset into t
28e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28e40 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
28e50 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64  f the.** payload
28e60 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
28e70 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
28e80 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
28e90 42 74 72 65 65 4f 66 66 73 65 74 28 42 74 43 75  BtreeOffset(BtCu
28ea0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
28eb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
28ec0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
28ed0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28ee0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28ef0 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65  VALID );.  getCe
28f00 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
28f10 72 65 74 75 72 6e 20 28 69 36 34 29 70 43 75 72  return (i64)pCur
28f20 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  ->pBt->pageSize*
28f30 28 28 69 36 34 29 70 43 75 72 2d 3e 70 50 61 67  ((i64)pCur->pPag
28f40 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20  e->pgno - 1) +. 
28f50 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70 43          (i64)(pC
28f60 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
28f70 64 20 2d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  d - pCur->pPage-
28f80 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69  >aData);.}.#endi
28f90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
28fa0 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55  LE_OFFSET_SQL_FU
28fb0 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  NC */../*.** Ret
28fc0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
28fd0 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  f bytes of paylo
28fe0 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ad for the entry
28ff0 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
29000 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
29010 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62  ing to.  For tab
29020 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69 73 20  le btrees, this 
29030 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75  will be the amou
29040 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20  nt.** of data.  
29050 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65 73  For index btrees
29060 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  , this will be t
29070 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b  he size of the k
29080 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
29090 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
290a0 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
290b0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
290c0 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
290d0 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
290e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
290f0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
29100 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
29110 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
29120 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
29130 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
29140 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73  _VALID..*/.u32 s
29150 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
29160 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  adSize(BtCursor 
29170 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
29180 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
29190 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
291a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
291b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
291c0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
291d0 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  o(pCur);.  retur
291e0 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  n pCur->info.nPa
291f0 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  yload;.}../*.** 
29200 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
29210 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
29220 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
29230 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
29240 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
29250 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
29260 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
29270 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
29280 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
29290 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
292a0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
292b0 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
292c0 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
292d0 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
292e0 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
292f0 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
29300 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
29310 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
29320 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
29330 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
29340 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29350 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
29360 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
29370 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
29380 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
29390 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
293a0 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
293b0 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
293c0 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
293d0 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
293e0 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
293f0 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
29400 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
29410 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
29420 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
29430 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
29440 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
29450 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
29460 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
29470 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
29480 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
29490 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
294a0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
294b0 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
294c0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
294d0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
294e0 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
294f0 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
29500 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
29510 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
29520 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
29530 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
29540 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
29550 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
29560 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
29570 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
29580 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
29590 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
295a0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
295b0 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
295c0 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
295d0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
295e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
295f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
29600 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29620 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
29630 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
29640 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
29650 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
29660 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
29670 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
29680 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
29690 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
296a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
296b0 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
296c0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
296d0 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
296e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
296f0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
29700 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
29710 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29720 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
29730 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
29740 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
29750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29760 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29770 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
29780 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
29790 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
297a0 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
297b0 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
297c0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
297d0 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
297e0 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
297f0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
29800 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
29810 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
29820 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
29830 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
29840 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
29850 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
29860 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
29870 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
29880 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
29890 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
298a0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
298b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
298c0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
298d0 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
298e0 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
298f0 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
29900 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
29910 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
29920 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
29930 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
29940 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
29950 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
29960 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65  f( iGuess<=btree
29970 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
29980 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
29990 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
299a0 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
299b0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
299c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
299d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
299e0 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
299f0 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
29a00 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
29a10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
29a20 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
29a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
29a40 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
29a50 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
29a60 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
29a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29a80 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
29a90 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
29aa0 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61  l, &pPage, (ppPa
29ab0 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47  ge==0) ? PAGER_G
29ac0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
29ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
29ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
29af0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
29b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29b10 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
29b20 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
29b30 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
29b40 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
29b50 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
29b60 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
29b70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
29b80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
29b90 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
29ba0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
29bb0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
29bc0 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
29bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
29be0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
29bf0 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
29c00 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
29c10 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
29c20 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
29c30 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
29c40 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
29c50 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
29c60 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
29c70 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
29c80 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
29c90 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
29ca0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
29cb0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
29cc0 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
29cd0 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
29ce0 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
29cf0 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
29d00 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
29d10 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
29d20 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
29d30 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
29d40 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
29d50 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
29d60 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29d70 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
29d80 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
29d90 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
29da0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
29db0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
29dc0 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
29dd0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
29de0 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
29df0 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
29e00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
29e10 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
29e20 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e40 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
29e50 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
29e60 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
29e70 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
29e80 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
29e90 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
29ea0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
29eb0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
29ec0 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
29ed0 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
29ee0 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
29ef0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
29f00 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
29f10 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
29f20 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
29f30 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
29f40 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
29f50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
29f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29f70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29f80 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
29f90 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
29fa0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
29fb0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
29fc0 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
29fd0 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
29fe0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
29ff0 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
2a000 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
2a010 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2a020 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2a030 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a040 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
2a050 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
2a060 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
2a070 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
2a080 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
2a090 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
2a0a0 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61  to. The eOp.** a
2a0b0 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72  rgument is inter
2a0c0 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
2a0d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68  s:.**.**   0: Th
2a0e0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
2a0f0 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20   read. Populate 
2a100 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
2a110 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20  he..**   1: The 
2a120 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77  operation is a w
2a130 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74  rite. Populate t
2a140 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
2a150 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
2a160 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
2a170 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
2a180 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
2a190 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
2a1a0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
2a1b0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
2a1c0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
2a1d0 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
2a1e0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
2a1f0 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
2a200 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
2a210 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
2a220 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
2a230 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
2a240 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2a250 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
2a260 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
2a270 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2a280 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  s.** this functi
2a290 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20  on may allocate 
2a2a0 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
2a2b0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a  zily populate.**
2a2c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2a2d0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
2a2e0 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
2a2f0 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
2a300 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
2a310 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
2a320 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
2a330 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
2a340 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
2a350 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
2a360 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
2a370 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
2a380 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
2a390 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a  ed, it must be.*
2a3a0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
2a3b0 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
2a3c0 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
2a3d0 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
2a3e0 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
2a3f0 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
2a400 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
2a410 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
2a420 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
2a430 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
2a440 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
2a450 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
2a460 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
2a470 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
2a480 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
2a490 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
2a4a0 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
2a4b0 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
2a4c0 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
2a4d0 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
2a4e0 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
2a4f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
2a500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2a510 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
2a520 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a530 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
2a540 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
2a550 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
2a560 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
2a570 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
2a580 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
2a590 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
2a5a0 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
2a5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2a5c0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
2a5d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2a5e0 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
2a5f0 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
2a600 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
2a610 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
2a620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
2a630 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
2a640 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
2a650 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
2a660 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
2a670 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a680 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
2a690 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2a6a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2a6b0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2a6c0 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65     /* Btree page
2a6d0 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
2a6e0 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
2a6f0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
2a700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a710 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
2a720 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
2a730 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
2a740 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
2a750 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
2a760 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
2a770 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
2a780 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  f;     /* Start 
2a790 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20  of original out 
2a7a0 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66  buffer */.#endif
2a7b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2a7c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  e );.  assert( e
2a7d0 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20  Op==0 || eOp==1 
2a7e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a7f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2a800 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2a810 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50  ert( pCur->ix<pP
2a820 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2a830 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2a840 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2a850 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
2a860 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
2a870 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
2a880 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65  pPayload;.  asse
2a890 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
2a8a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
2a8b0 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65  yload );..  asse
2a8c0 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70  rt( aPayload > p
2a8d0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
2a8e0 20 69 66 28 20 28 75 70 74 72 29 28 61 50 61 79   if( (uptr)(aPay
2a8f0 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44  load - pPage->aD
2a900 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61  ata) > (pBt->usa
2a910 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e  bleSize - pCur->
2a920 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a  info.nLocal) ){.
2a930 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
2a940 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
2a950 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2a960 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
2a970 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  ror.  The.    **
2a980 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
2a990 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20  ve is really:.  
2a9a0 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61    **    &aPayloa
2a9b0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
2a9c0 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
2a9d0 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
2a9e0 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74  Size].    ** but
2a9f0 20 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20   is recast into 
2aa00 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d  its current form
2aa10 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65   to avoid intege
2aa20 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c  r overflow probl
2aa30 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ems.    */.    r
2aa40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2aa50 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
2aa60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
2aa70 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
2aa80 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
2aa90 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
2aaa0 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
2aab0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
2aac0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
2aad0 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
2aae0 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
2aaf0 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
2ab00 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
2ab10 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
2ab20 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
2ab30 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
2ab40 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
2ab50 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
2ab60 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
2ab70 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2ab80 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
2ab90 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
2aba0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
2abb0 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
2abc0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
2abd0 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
2abe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2abf0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
2ac00 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
2ac10 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2ac20 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
2ac30 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
2ac40 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
2ac50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
2ac60 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
2ac70 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
2ac80 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
2ac90 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
2aca0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
2acb0 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
2acc0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
2acd0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
2ace0 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
2acf0 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
2ad00 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
2ad10 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
2ad20 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
2ad30 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
2ad40 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
2ad50 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
2ad60 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
2ad70 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
2ad80 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
2ad90 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
2ada0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
2adb0 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
2adc0 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
2add0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
2ade0 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
2adf0 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
2ae00 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
2ae10 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2ae20 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2ae30 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
2ae40 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
2ae50 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
2ae60 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
2ae70 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
2ae80 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
2ae90 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
2aea0 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20  verflow==0.     
2aeb0 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29    || nOvfl*(int)
2aec0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73  sizeof(Pgno) > s
2aed0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
2aee0 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
2aef0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2af00 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
2af10 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
2af20 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
2af30 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
2af40 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
2af50 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
2af60 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2af70 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
2af80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2af90 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2afa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2afb0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
2afc0 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
2afd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2afe0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
2aff0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
2b000 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
2b010 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43  Pgno));.      pC
2b020 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2b030 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
2b040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b050 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
2b060 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
2b070 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
2b080 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
2b090 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f       ** entry fo
2b0a0 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
2b0b0 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
2b0c0 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
2b0d0 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63  p.      ** direc
2b0e0 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20  tly to it..     
2b0f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2b100 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
2b110 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
2b120 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78 20 3d  {.        iIdx =
2b130 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
2b140 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  e);.        next
2b150 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
2b160 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
2b170 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
2b180 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
2b190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b1a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
2b1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
2b1c0 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  t>0 );.    while
2b1d0 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20  ( nextPage ){.  
2b1e0 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
2b1f0 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
2b200 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
2b210 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
2b220 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2b230 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
2b240 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  ]==0.           
2b250 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65     || pCur->aOve
2b260 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
2b270 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 20  tPage.          
2b280 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
2b290 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  B );.      pCur-
2b2a0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
2b2b0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20   = nextPage;..  
2b2c0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
2b2d0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
2b2e0 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
2b2f0 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
2b300 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
2b310 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
2b320 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2b330 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
2b340 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
2b350 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
2b360 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
2b370 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
2b380 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
2b390 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
2b3a0 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
2b3b0 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
2b3c0 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
2b3d0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
2b3e0 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
2b3f0 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
2b400 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
2b410 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2b420 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  rt( pCur->curFla
2b430 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2b440 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61  vfl );.        a
2b450 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74  ssert( pCur->pBt
2b460 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62  ree->db==pBt->db
2b470 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2b480 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2b490 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
2b4a0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
2b4b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2b4c0 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
2b4d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b4e0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
2b4f0 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
2b500 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
2b510 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2b520 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
2b530 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
2b540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b550 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
2b560 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
2b570 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
2b580 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
2b590 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
2b5a0 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
2b5b0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
2b5c0 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
2b5d0 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
2b5e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2b5f0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
2b600 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
2b610 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
2b620 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20     /* File from 
2b630 77 68 69 63 68 20 74 6f 20 64 6f 20 64 69 72 65  which to do dire
2b640 63 74 20 6f 76 65 72 66 6c 6f 77 20 72 65 61 64  ct overflow read
2b650 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   */.#endif.     
2b660 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
2b670 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
2b680 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
2b690 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
2b6a0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
2b6b0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
2b6c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2b6d0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
2b6e0 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
2b6f0 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
2b700 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
2b710 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2b720 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
2b730 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
2b740 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
2b750 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
2b760 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
2b770 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
2b780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
2b790 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
2b7a0 33 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  3) there is no o
2b7b0 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
2b7c0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
2b7d0 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64     **   4) the d
2b7e0 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
2b7f0 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
2b800 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
2b810 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
2b820 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20  he WAL file.    
2b830 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c      **   6) at l
2b840 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76  east 4 bytes hav
2b850 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
2b860 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ead into the out
2b870 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20  put buffer .    
2b880 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2b890 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
2b8a0 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
2b8b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2b8c0 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
2b8d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
2b8e0 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
2b8f0 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
2b900 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
2b910 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
2b920 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
2b930 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
2b940 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
2b950 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
2b960 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2b970 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20    if( eOp==0    
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
2b9b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
2b9c0 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9f0 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
2ba00 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54       && pBt->inT
2ba10 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
2ba20 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  S_READ          
2ba30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33             /* (3
2ba40 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
2ba50 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   (fd = sqlite3Pa
2ba60 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
2ba70 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20  ger))->pMethods 
2ba80 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
2ba90 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
2baa0 69 74 65 33 50 61 67 65 72 55 73 65 57 61 6c 28  ite3PagerUseWal(
2bab0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
2bac0 74 50 61 67 65 29 20 20 20 20 20 20 20 2f 2a 20  tPage)       /* 
2bad0 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (5) */.         
2bae0 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42  && &pBuf[-4]>=pB
2baf0 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20  ufStart         
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb10 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
2bb20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2bb30 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
2bb40 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
2bb50 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
2bb60 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  4];.          as
2bb70 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42  sert( aWrite>=pB
2bb80 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20  ufStart );      
2bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bba0 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29     /* due to (6)
2bbb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
2bbc0 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69  mcpy(aSave, aWri
2bbd0 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  te, 4);.        
2bbe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2bbf0 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c  Read(fd, aWrite,
2bc00 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e   a+4, (i64)pBt->
2bc10 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61  pageSize*(nextPa
2bc20 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ge-1));.        
2bc30 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
2bc40 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20  4byte(aWrite);. 
2bc50 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2bc60 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34  aWrite, aSave, 4
2bc70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2bc80 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
2bc90 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50   {.          DbP
2bca0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
2bcb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2bcc0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
2bcd0 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
2bce0 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20  ge, &pDbPage,.  
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 28 65 4f 70              (eOp
2bd00 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
2bd10 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
2bd20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2bd30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2bd40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bd50 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
2bd60 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2bd70 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
2bd80 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
2bd90 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
2bda0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
2bdb0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
2bdc0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
2bdd0 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
2bde0 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
2bdf0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2be00 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2be10 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
2be20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
2be30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
2be40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2be50 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
2be60 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29      if( amt==0 )
2be70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2be80 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
2be90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2bea0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
2beb0 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d     iIdx++;.    }
2bec0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
2bed0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
2bee0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  >0 ){.    /* Ove
2bef0 72 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73  rflow chain ends
2bf00 20 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a   prematurely */.
2bf10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bf20 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
2bf30 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
2bf40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2bf50 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
2bf60 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68  e payload for th
2bf70 65 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74  e row at which t
2bf80 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
2bf90 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
2bfa0 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22  pointing.  "amt"
2bfb0 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
2bfc0 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20  ransferred into 
2bfd0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
2bfe0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
2bff0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
2c000 2a 2a 20 70 43 75 72 20 63 61 6e 20 62 65 20 70  ** pCur can be p
2c010 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65  ointing to eithe
2c020 72 20 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20  r a table or an 
2c030 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a  index b-tree..**
2c040 20 49 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   If pointing to 
2c050 61 20 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74  a table btree, t
2c060 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
2c070 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
2c080 20 20 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20    If.** pCur is 
2c090 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69  pointing to an i
2c0a0 6e 64 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e  ndex b-tree then
2c0b0 20 74 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e   the key section
2c0c0 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
2c0d0 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
2c0e0 50 61 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63  Payload(), the c
2c0f0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
2c100 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
2c110 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
2c120 76 61 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65  valid row in the
2c130 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c   table.  For sql
2c140 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2c150 43 68 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a  Checked(), the.*
2c160 2a 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62  * cursor might b
2c170 65 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67  e invalid or mig
2c180 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ht need to be re
2c190 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65  stored before be
2c1a0 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ing read..**.** 
2c1b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2c1c0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
2c1d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
2c1e0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
2c1f0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
2c200 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
2c210 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
2c220 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
2c230 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
2c240 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
2c250 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
2c260 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
2c270 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
2c280 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
2c290 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
2c2a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2c2b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2c2c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2c2d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2c2e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c2f0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
2c300 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
2c310 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43  ert( pCur->ix<pC
2c320 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2c330 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
2c340 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2c350 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
2c360 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
2c370 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
2c380 20 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66   This variant of
2c390 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
2c3a0 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65  load() works eve
2c3b0 6e 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  n if the cursor 
2c3c0 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68  has not.** in th
2c3d0 65 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73  e CURSOR_VALID s
2c3e0 74 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c  tate.  It is onl
2c3f0 79 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71  y used by the sq
2c400 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
2c410 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
2c420 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2c430 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
2c440 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
2c450 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73  INLINE int acces
2c460 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
2c470 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2c480 72 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  r,.  u32 offset,
2c490 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f  .  u32 amt,.  vo
2c4a0 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e  id *pBuf.){.  in
2c4b0 74 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75  t rc;.  if ( pCu
2c4c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2c4d0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
2c4e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
2c4f0 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BORT;.  }.  asse
2c500 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2c510 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2c520 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74    rc = btreeRest
2c530 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2c540 6e 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  n(pCur);.  retur
2c550 6e 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65  n rc ? rc : acce
2c560 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2c570 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
2c580 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  f, 0);.}.int sql
2c590 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2c5a0 43 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72  Checked(BtCursor
2c5b0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
2c5c0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
2c5d0 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20  d *pBuf){.  if( 
2c5e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c5f0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2c600 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2c610 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2c620 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r) );.    return
2c630 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
2c640 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
2c650 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65  , pBuf, 0);.  }e
2c660 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2c670 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65  accessPayloadChe
2c680 63 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65  cked(pCur, offse
2c690 74 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20  t, amt, pBuf);. 
2c6a0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
2c6b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
2c6c0 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  LOB */../*.** Re
2c6d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2c6e0 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
2c6f0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
2c700 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
2c710 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
2c720 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
2c730 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
2c740 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2c750 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
2c760 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
2c770 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
2c780 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
2c790 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
2c7a0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
2c7b0 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
2c7c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
2c7d0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
2c7e0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
2c7f0 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
2c800 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
2c810 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
2c820 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
2c830 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
2c840 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2c850 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
2c860 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
2c870 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
2c880 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
2c890 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
2c8a0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
2c8b0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
2c8c0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
2c8d0 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
2c8e0 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
2c8f0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
2c900 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
2c910 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
2c920 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
2c930 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
2c940 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
2c950 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
2c960 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
2c970 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
2c980 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
2c990 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
2c9a0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
2c9b0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
2c9c0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
2c9d0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
2c9e0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
2c9f0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
2ca00 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
2ca10 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
2ca20 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
2ca30 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
2ca40 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
2ca50 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
2ca60 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
2ca70 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
2ca80 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
2ca90 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
2caa0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
2cab0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2cac0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
2cad0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
2cae0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
2caf0 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
2cb00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2cb10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
2cb20 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
2cb30 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d  e */.){.  int am
2cb40 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  t;.  assert( pCu
2cb50 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
2cb60 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
2cb70 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  pPage);.  assert
2cb80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2cb90 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2cba0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2cbb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2cbc0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2cbd0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2cbe0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2cbf0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2cc00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2cc10 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
2cc20 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2cc30 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2cc40 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ze>0 );.  assert
2cc50 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
2cc60 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61 67  yload>pCur->pPag
2cc70 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52  e->aData || CORR
2cc80 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
2cc90 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
2cca0 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50  Payload<pCur->pP
2ccb0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  age->aDataEnd ||
2ccc0 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
2ccd0 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
2cce0 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d  nLocal;.  if( am
2ccf0 74 3e 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50  t>(int)(pCur->pP
2cd00 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  age->aDataEnd - 
2cd10 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2cd20 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  oad) ){.    /* T
2cd30 68 65 72 65 20 69 73 20 74 6f 6f 20 6c 69 74 74  here is too litt
2cd40 6c 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  le space on the 
2cd50 70 61 67 65 20 66 6f 72 20 74 68 65 20 65 78 70  page for the exp
2cd60 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20  ected amount.   
2cd70 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e   ** of local con
2cd80 74 65 6e 74 2e 20 44 61 74 61 62 61 73 65 20 6d  tent. Database m
2cd90 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2cda0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  */.    assert( C
2cdb0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
2cdc0 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28 69   amt = MAX(0, (i
2cdd0 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  nt)(pCur->pPage-
2cde0 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
2cdf0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
2ce00 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d  );.  }.  *pAmt =
2ce10 20 28 75 33 32 29 61 6d 74 3b 0a 20 20 72 65 74   (u32)amt;.  ret
2ce20 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d  urn (void*)pCur-
2ce30 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
2ce40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
2ce50 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
2ce60 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
2ce70 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
2ce80 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
2ce90 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
2cea0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
2ceb0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
2cec0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2ced0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
2cee0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
2cef0 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
2cf00 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
2cf10 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
2cf20 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
2cf30 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
2cf40 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
2cf50 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
2cf60 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
2cf70 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
2cf80 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
2cf90 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
2cfa0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
2cfb0 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
2cfc0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
2cfd0 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
2cfe0 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
2cff0 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
2d000 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
2d010 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
2d020 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
2d030 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
2d040 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
2d050 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
2d060 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
2d070 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
2d080 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
2d090 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50  d *sqlite3BtreeP
2d0a0 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75  ayloadFetch(BtCu
2d0b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
2d0c0 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
2d0d0 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
2d0e0 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
2d0f0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2d100 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
2d110 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
2d120 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
2d130 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
2d140 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2d150 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
2d160 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
2d170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2d180 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
2d190 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
2d1a0 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
2d1b0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
2d1c0 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
2d1d0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
2d1e0 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
2d1f0 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
2d200 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
2d210 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
2d220 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
2d230 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
2d240 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
2d250 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
2d260 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
2d270 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d280 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
2d290 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2d2a0 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  pCur->pBt;.  int
2d2b0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2d2c0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2d2d0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2d2e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2d2f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2d300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d310 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
2d320 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
2d330 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d340 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
2d350 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
2d360 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
2d370 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
2d380 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2d390 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
2d3a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2d3b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2d3c0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2d3d0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2d3e0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
2d3f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d400 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 69 78  Page] = pCur->ix
2d410 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
2d420 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2d430 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
2d440 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70  Cur->ix = 0;.  p
2d450 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20  Cur->iPage++;.  
2d460 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
2d470 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
2d480 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a  , &pCur->pPage,.
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4a0 20 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43          pCur, pC
2d4b0 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2d4c0 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
2d4d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2d4e0 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28 70 43  etMempageRoot(pC
2d4f0 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
2d500 3e 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 7d 0a  >pgnoRoot);.  }.
2d510 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d520 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2d530 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
2d540 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
2d550 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
2d560 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
2d570 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
2d580 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
2d590 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
2d5a0 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
2d5b0 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
2d5c0 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
2d5d0 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
2d5e0 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
2d5f0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2d600 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
2d610 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
2d620 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
2d630 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
2d640 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
2d650 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
2d660 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
2d670 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
2d680 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
2d690 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
2d6a0 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
2d6b0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
2d6c0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73  e conditions tes
2d6d0 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20  ted below might 
2d6e0 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20  not be true.    
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d700 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20          ** in a 
2d710 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
2d720 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49   */.  assert( iI
2d730 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
2d740 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
2d750 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
2d760 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d770 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
2d780 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2d790 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
2d7a0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
2d7b0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2d7c0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2d7d0 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
2d7e0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
2d7f0 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
2d800 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
2d810 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
2d820 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
2d830 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
2d840 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2d850 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
2d860 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
2d870 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
2d880 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
2d890 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
2d8a0 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
2d8b0 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
2d8c0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
2d8d0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
2d8e0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
2d8f0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
2d900 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
2d910 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
2d920 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
2d930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
2d940 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
2d950 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2d960 50 61 67 65 20 2a 70 4c 65 61 66 3b 0a 20 20 61  Page *pLeaf;.  a
2d970 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2d980 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2d990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d9a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d9b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2d9c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2d9d0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2d9e0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
2d9f0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
2da00 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
2da10 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2da20 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
2da30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2da40 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
2da50 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29  >pPage->pgno.  )
2da60 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  ;.  testcase( pC
2da70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2da80 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
2da90 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2daa0 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
2dab0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2dac0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2dad0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2dae0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2daf0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2db00 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72   pCur->ix = pCur
2db10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2db20 61 67 65 2d 31 5d 3b 0a 20 20 70 4c 65 61 66 20  age-1];.  pLeaf 
2db30 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2db40 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70   pCur->pPage = p
2db50 43 75 72 2d 3e 61 70 50 61 67 65 5b 2d 2d 70 43  Cur->apPage[--pC
2db60 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 72 65  ur->iPage];.  re
2db70 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
2db80 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pLeaf);.}../*.*
2db90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2dba0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
2dbb0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
2dbc0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
2dbd0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
2dbe0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
2dbf0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
2dc00 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2dc10 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
2dc20 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
2dc30 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
2dc40 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
2dc50 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
2dc60 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
2dc70 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2dc80 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
2dc90 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
2dca0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
2dcb0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
2dcc0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
2dcd0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2dce0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
2dcf0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
2dd00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
2dd10 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
2dd20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
2dd30 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
2dd40 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
2dd50 49 4e 56 41 4c 49 44 20 61 6e 64 20 74 68 69 73  INVALID and this
2dd60 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2dd70 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20 4f   SQLITE_EMPTY. O
2dd80 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 65  therwise,.** the
2dd90 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
2dda0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
2ddb0 69 72 73 74 20 63 65 6c 6c 20 6c 6f 63 61 74 65  irst cell locate
2ddc0 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  d on the root.**
2ddd0 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
2dde0 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
2ddf0 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
2de00 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
2de10 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
2de20 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2de30 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
2de40 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
2de50 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
2de60 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
2de70 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
2de80 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
2de90 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
2dea0 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
2deb0 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
2dec0 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
2ded0 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
2dee0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
2def0 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
2df00 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
2df10 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
2df20 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
2df30 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
2df40 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
2df50 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
2df60 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
2df70 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
2df80 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
2df90 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
2dfa0 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
2dfb0 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
2dfc0 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
2dfd0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
2dfe0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
2dff0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2e000 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
2e010 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2e020 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2e030 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2e040 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2e050 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
2e060 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
2e070 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2e080 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
2e090 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
2e0a0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
2e0b0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
2e0c0 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
2e0d0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
2e0e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e0f0 65 53 74 61 74 65 20 3c 20 43 55 52 53 4f 52 5f  eState < CURSOR_
2e100 52 45 51 55 49 52 45 53 45 45 4b 20 7c 7c 20 70  REQUIRESEEK || p
2e110 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a  Cur->iPage<0 );.
2e120 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e130 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20 70 43  pgnoRoot>0 || pC
2e140 75 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 0a  ur->iPage<0 );..
2e150 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2e160 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e>=0 ){.    if( 
2e170 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
2e180 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e190 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70 50  NotNull(pCur->pP
2e1a0 61 67 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  age);.      whil
2e1b0 65 28 20 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65  e( --pCur->iPage
2e1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2e1d0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2e1e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e1f0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 20 20 20  ->iPage]);.     
2e200 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70   }.      pCur->p
2e210 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2e220 61 67 65 5b 30 5d 3b 0a 20 20 20 20 20 20 67 6f  age[0];.      go
2e230 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20  to skip_init;.  
2e240 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2e250 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2e260 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
2e270 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2e280 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75  NVALID;.    retu
2e290 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b  rn SQLITE_EMPTY;
2e2a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2e2b0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2e2c0 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 69  e==(-1) );.    i
2e2d0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
2e2e0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
2e2f0 45 45 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  EEK ){.      if(
2e300 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2e310 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
2e320 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2e330 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
2e340 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2e350 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
2e360 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 20  >skipNext;.     
2e370 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2e380 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
2e390 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2e3a0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2e3b0 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
2e3c0 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
2e3d0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
2e3e0 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  pPage,.         
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2e400 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
2e410 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
2e420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e430 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2e440 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2e450 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
2e460 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2e470 20 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28   setMempageRoot(
2e480 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
2e490 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  r->pgnoRoot);.  
2e4a0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
2e4b0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  0;.    pCur->cur
2e4c0 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 70  IntKey = pCur->p
2e4d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20  Page->intKey;.  
2e4e0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
2e4f0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2e500 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
2e510 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
2e520 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  ;..  /* If pCur-
2e530 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
2e540 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
2e550 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
2e560 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
2e570 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
2e580 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
2e590 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
2e5a0 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
2e5b0 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c  fo is.  ** NULL,
2e5c0 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
2e5d0 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
2e5e0 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
2e5f0 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a  ot the case,.  *
2e600 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
2e610 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
2e620 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72  . .  **.  ** Ear
2e630 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lier versions of
2e640 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20   SQLite assumed 
2e650 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63  that this test c
2e660 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20  ould not fail.  
2e670 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70  ** if the root p
2e680 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  age was already 
2e690 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73  loaded when this
2e6a0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
2e6b0 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20  lled (i.e..  ** 
2e6c0 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  if pCur->iPage>=
2e6d0 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20  0). But this is 
2e6e0 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61  not so if the da
2e6f0 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2e700 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63  ted .  ** in suc
2e710 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67  h a way that pag
2e720 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65  e pRoot is linke
2e730 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20  d into a second 
2e740 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20  b-tree table .  
2e750 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c  ** (or the freel
2e760 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ist).  */.  asse
2e770 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  rt( pRoot->intKe
2e780 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69  y==1 || pRoot->i
2e790 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66  ntKey==0 );.  if
2e7a0 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d  ( pRoot->isInit=
2e7b0 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65  =0 || (pCur->pKe
2e7c0 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74  yInfo==0)!=pRoot
2e7d0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2e7e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2e7f0 52 52 55 50 54 5f 50 41 47 45 28 70 43 75 72 2d  RRUPT_PAGE(pCur-
2e800 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b  >pPage);.  }..sk
2e810 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75  ip_init:  .  pCu
2e820 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75  r->ix = 0;.  pCu
2e830 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2e840 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2e850 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
2e860 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
2e870 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2e880 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20  fl);..  pRoot = 
2e890 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
2e8a0 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e  f( pRoot->nCell>
2e8b0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
2e8c0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2e8d0 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ALID;.  }else if
2e8e0 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  ( !pRoot->leaf )
2e8f0 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
2e900 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
2e910 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
2e920 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2e930 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
2e940 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
2e950 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
2e960 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
2e970 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
2e980 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2e990 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
2e9a0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2e9b0 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
2e9c0 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
2e9d0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2e9e0 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 53  ALID;.    rc = S
2e9f0 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
2ea00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ea10 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2ea20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
2ea30 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2ea40 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
2ea50 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
2ea60 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
2ea70 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
2ea80 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
2ea90 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
2eaa0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
2eab0 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
2eac0 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
2ead0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
2eae0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2eaf0 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
2eb00 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
2eb10 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
2eb20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2eb30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2eb40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2eb50 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2eb60 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2eb70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2eb80 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2eb90 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2eba0 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
2ebb0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
2ebc0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
2ebd0 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50  ert( pCur->ix<pP
2ebe0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2ebf0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2ec00 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2ec10 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20  , pCur->ix));.  
2ec20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2ec30 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
2ec40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ec50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2ec60 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2ec70 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
2ec80 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
2ec90 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
2eca0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
2ecb0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2ecc0 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
2ecd0 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
2ece0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
2ecf0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
2ed00 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
2ed10 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
2ed20 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
2ed30 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
2ed40 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
2ed50 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
2ed60 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
2ed70 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
2ed80 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
2ed90 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
2eda0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
2edb0 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
2edc0 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
2edd0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
2ede0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
2edf0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
2ee00 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2ee10 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
2ee20 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
2ee30 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
2ee40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ee50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2ee60 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
2ee70 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2ee80 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ee90 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2eea0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2eeb0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
2eec0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2eed0 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
2eee0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2eef0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2ef00 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2ef10 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  8]);.    pCur->i
2ef20 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
2ef30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2ef40 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
2ef50 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2ef60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2ef70 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2ef80 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61  ge->nCell-1;.  a
2ef90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2efa0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
2efb0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2efc0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2efd0 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a  alidNKey)==0 );.
2efe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2eff0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
2f000 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2f010 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2f020 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2f030 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
2f040 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
2f050 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
2f060 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
2f070 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
2f080 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
2f090 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
2f0a0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2f0b0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2f0c0 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
2f0d0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2f0e0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2f0f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2f100 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2f110 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2f120 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2f130 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2f140 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2f150 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
2f160 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2f170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f180 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2f190 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2f1a0 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  >0 );.    *pRes 
2f1b0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
2f1c0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2f1d0 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
2f1e0 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59  rc==SQLITE_EMPTY
2f1f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2f200 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2f210 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65  0 || pCur->pPage
2f220 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2f230 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2f240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f260 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2f270 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
2f280 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2f290 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2f2a0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2f2b0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2f2c0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2f2d0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2f2e0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2f2f0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2f300 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2f310 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2f320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2f330 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
2f340 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2f350 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
2f360 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2f370 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2f380 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2f390 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2f3a0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2f3b0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2f3c0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
2f3d0 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
2f3e0 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
2f3f0 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
2f400 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
2f410 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2f420 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
2f430 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2f440 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
2f450 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2f460 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
2f470 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
2f480 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
2f490 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
2f4a0 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
2f4b0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
2f4c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
2f4d0 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
2f4e0 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
2f4f0 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
2f500 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
2f510 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2f520 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
2f530 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
2f540 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
2f550 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d  sert( pCur->ix==
2f560 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2f570 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
2f580 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
2f590 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
2f5a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f5b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
2f5c0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2f5d0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2f5e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2f5f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2f600 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2f610 44 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D );.    *pRes =
2f620 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
2f630 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2f640 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
2f650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f660 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2f670 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
2f680 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f690 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2f6a0 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73  s &= ~BTCF_AtLas
2f6b0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
2f6c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f6d0 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73  EMPTY ){.    ass
2f6e0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2f6f0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2f700 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2f710 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  );.    *pRes = 1
2f720 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2f730 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
2f740 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
2f750 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
2f760 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2f770 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
2f780 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
2f790 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
2f7a0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
2f7b0 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
2f7c0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
2f7d0 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
2f7e0 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
2f7f0 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
2f800 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
2f810 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
2f820 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
2f830 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
2f840 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
2f850 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2f860 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
2f870 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
2f880 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
2f890 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
2f8a0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
2f8b0 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
2f8c0 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
2f8d0 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
2f8e0 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
2f8f0 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
2f900 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
2f910 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
2f920 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
2f930 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
2f940 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
2f950 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
2f960 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2f970 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
2f980 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
2f990 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
2f9a0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
2f9b0 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
2f9c0 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
2f9d0 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
2f9e0 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
2f9f0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2fa00 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
2fa10 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2fa20 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2fa30 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa50 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
2fa60 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
2fa70 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2fa80 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
2fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
2faa0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
2fab0 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
2fac0 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
2fad0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
2fae0 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
2faf0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2fb00 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2fb10 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2fb20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
2fb30 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
2fb40 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
2fb50 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
2fb60 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2fb70 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2fb80 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fba0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
2fbb0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2fbc0 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74  *.** For index t
2fbd0 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b  ables, the pIdxK
2fbe0 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64  ey->eqSeen field
2fbf0 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20   is set to 1 if 
2fc00 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20  there.** exists 
2fc10 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
2fc20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74  table that exact
2fc30 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b  ly matches pIdxK
2fc40 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ey.  .*/.int sql
2fc50 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
2fc60 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
2fc70 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
2fc80 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
2fc90 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
2fca0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
2fcb0 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
2fcc0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
2fcd0 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
2fce0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
2fcf0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
2fd00 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
2fd10 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
2fd20 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
2fd30 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
2fd40 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
2fd50 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
2fd60 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2fd70 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
2fd80 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2fd90 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f  t rc;.  RecordCo
2fda0 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d  mpare xRecordCom
2fdb0 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pare;..  assert(
2fdc0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2fdd0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2fde0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2fdf0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2fe00 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2fe10 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2fe20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
2fe30 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
2fe40 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2fe50 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
2fe60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2fe70 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28  URSOR_VALID || (
2fe80 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2fe90 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30  ur->curIntKey!=0
2fea0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2feb0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
2fec0 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
2fed0 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
2fee0 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
2fef0 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
2ff00 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
2ff10 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
2ff20 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78  rk */.  if( pIdx
2ff30 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75  Key==0.   && pCu
2ff40 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ff50 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72  R_VALID && (pCur
2ff60 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2ff70 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a  F_ValidNKey)!=0.
2ff80 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
2ff90 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
2ffa0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
2ffb0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2ffc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ffd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2ffe0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
2fff0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69  ntKey ){.      i
30000 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
30010 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
30020 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
30030 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
30040 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30050 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
30060 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
30070 71 75 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f  quested key is o
30080 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ne more than the
30090 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74   previous key, t
300a0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79  hen.      ** try
300b0 20 74 6f 20 67 65 74 20 74 68 65 72 65 20 75 73   to get there us
300c0 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65 65  ing sqlite3Btree
300d0 4e 65 78 74 28 29 20 72 61 74 68 65 72 20 74 68  Next() rather th
300e0 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20  an a full.      
300f0 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  ** binary search
30100 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
30110 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
30120 20 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e    The correct an
30130 73 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  swer.      ** is
30140 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20   still obtained 
30150 77 69 74 68 6f 75 74 20 74 68 69 73 20 63 61 73  without this cas
30160 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65  e, only a little
30170 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f   more slowely */
30180 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
30190 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e  >info.nKey+1==in
301a0 74 4b 65 79 20 26 26 20 21 70 43 75 72 2d 3e 73  tKey && !pCur->s
301b0 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
301c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
301d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
301e0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
301f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
30200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  ){.          get
30220 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
30230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
30240 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
30250 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
30260 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30270 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
30280 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
30290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
302a0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
302b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
302c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
302d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
302e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
302f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30300 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
30310 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
30320 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
30330 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
30340 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
30350 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
30360 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
30370 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
30380 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
30390 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
303a0 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
303b0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
303c0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
303d0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
303e0 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
303f0 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
30400 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
30410 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
30420 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
30430 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
30440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30450 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 20 20  _EMPTY ){.      
30460 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
30470 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
30480 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
30490 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
304a0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
304b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
304c0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
304d0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
304e0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
304f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
30500 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
30510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
30520 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
30530 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
30540 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
30550 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20  ->nCell > 0 );. 
30560 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
30570 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Page==0 || pCur-
30580 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
30590 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey==pCur->curInt
305a0 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
305b0 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
305c0 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
305d0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
305e0 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
305f0 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
30600 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
30610 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
30620 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20 2a 70  pPage;.    u8 *p
30630 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
30640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30650 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
30660 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
30670 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
30680 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
30690 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
306a0 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
306b0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
306c0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
306d0 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
306e0 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
306f0 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
30700 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
30710 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
30720 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
30730 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
30740 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
30750 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
30760 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
30770 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
30780 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
30790 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
307a0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
307b0 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
307c0 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
307d0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
307e0 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
307f0 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
30800 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
30810 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
30820 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
30830 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
30840 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
30850 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
30860 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
30870 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
30880 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
30890 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
308a0 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
308b0 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
308c0 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
308d0 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
308e0 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
308f0 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
30900 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
30910 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20  */.    pCur->ix 
30920 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
30930 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
30940 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
30950 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
30960 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
30970 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
30980 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
30990 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20  age, idx);.     
309a0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
309b0 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
309c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38        while( 0x8
309d0 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20  0 <= *(pCell++) 
309e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
309f0 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d  f( pCell>=pPage-
30a00 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20  >aDataEnd ){.   
30a10 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
30a20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
30a30 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
30a40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30a60 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
30a70 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
30a80 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
30a90 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
30aa0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
30ab0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
30ac0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
30ad0 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
30ae0 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
30af0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
30b00 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
30b10 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
30b20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
30b30 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
30b40 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
30b50 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
30b60 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
30b70 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
30b80 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
30b90 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
30ba0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
30bb0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
30bc0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
30bd0 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
30be0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
30bf0 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a  eto_next_layer;.
30c00 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
30c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
30c20 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
30c30 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
30c40 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
30c50 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
30c60 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
30c70 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
30c80 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
30c90 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
30cb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30cc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30cd0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
30ce0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
30cf0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
30d00 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
30d10 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
30d20 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
30d30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30d40 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
30d50 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a    int nCell;  /*
30d60 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65   Size of the pCe
30d70 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73  ll cell in bytes
30d80 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c   */.        pCel
30d90 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
30da0 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
30db0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
30dc0 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
30dd0 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
30de0 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69  65536 bytes. Thi
30df0 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
30e00 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
30e10 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
30e20 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
30e30 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
30e40 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
30e50 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61  page is less tha
30e60 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e  n 16384 bytes an
30e70 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  d may be stored 
30e80 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
30e90 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
30ea0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
30eb0 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
30ec0 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
30ed0 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
30ee0 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
30ef0 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
30f00 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
30f10 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
30f20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
30f30 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
30f40 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
30f50 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
30f60 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
30f70 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
30f80 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
30f90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65    */.        nCe
30fa0 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
30fb0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
30fc0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74  <=pPage->max1byt
30fd0 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  ePayload ){.    
30fe0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
30ff0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
31000 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
31010 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
31020 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
31030 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
31040 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
31050 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
31060 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
31070 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
31080 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
31090 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
310a0 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
310b0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
310c0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
310d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
310e0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
310f0 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
31100 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
31110 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
31120 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
31130 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
31140 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
31150 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
31160 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
31170 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
31180 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
31190 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
311a0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
311b0 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
311c0 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
311d0 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
311e0 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
311f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
31200 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
31210 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61  Cell+2==pPage->a
31220 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
31230 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
31240 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
31250 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c  void*)&pCell[2],
31260 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
31270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31280 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
31290 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
312a0 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
312b0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
312c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
312d0 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
312e0 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
312f0 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
31300 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
31310 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
31320 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
31330 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
31340 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
31350 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
31360 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
31370 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
31380 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
31390 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  . .          **.
313a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
313b0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  the record is co
313c0 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f  rrupt, the xReco
313d0 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e  rdCompare routin
313e0 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20  e may read.     
313f0 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77       ** up to tw
31400 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74  o varints past t
31410 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
31420 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31  ffer. An extra 1
31430 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  8 .          ** 
31440 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
31450 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74   is allocated at
31460 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31470 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20  buffer in.      
31480 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73      ** case this
31490 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20   happens.  */.  
314a0 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
314b0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
314c0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
314d0 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
314e0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
314f0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
31500 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
31510 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  l(pPage, pCellBo
31520 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
31530 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
31540 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
31550 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
31560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
31570 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72  ell<0 );   /* Tr
31580 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69  ue if key size i
31590 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a  s 2^32 or more *
315a0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
315b0 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29  case( nCell==0 )
315c0 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
315d0 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
315e0 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20  80 0x00 */.     
315f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
31600 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49  Cell==1 );  /* I
31610 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
31620 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31    0x80 0x80 0x01
31630 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
31640 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32  stcase( nCell==2
31650 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
31660 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20  legal index key 
31670 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  size */.        
31680 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b    if( nCell<2 ){
31690 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
316a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
316b0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
316c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
316d0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
316e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
316f0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
31700 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
31710 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20  ell+18 );.      
31720 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
31730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
31740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
31750 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
31760 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
31770 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
31780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31790 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
317a0 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
317b0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
317c0 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
317d0 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
317e0 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b  r*)pCellKey, 0);
317f0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
31800 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
31810 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
31820 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
31830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
31840 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
31850 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
31860 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
31870 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
31880 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
31890 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
318a0 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
318b0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
318c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
318d0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
318e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
318f0 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
31900 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
31910 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
31920 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
31930 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
31940 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
31950 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
31960 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
31970 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
31980 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
31990 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
319a0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
319b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
319c0 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
319d0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
319e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
319f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31a00 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
31a10 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
31a20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31a30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31a40 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
31a50 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
31a60 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
31a70 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
31a80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
31a90 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
31aa0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
31ab0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31ac0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
31ad0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
31ae0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
31af0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
31b00 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
31b10 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
31b20 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
31b30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
31b40 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
31b50 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
31b60 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
31b70 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
31b80 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
31b90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
31ba0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
31bb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
31bc0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
31bd0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43  Cell );.      pC
31be0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
31bf0 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  x;.      *pRes =
31c00 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
31c10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31c20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
31c30 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f  sh;.    }.moveto
31c40 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20  _next_layer:.   
31c50 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
31c60 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
31c70 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
31c80 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
31c90 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31ca0 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
31cb0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
31cc0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
31cd0 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
31ce0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
31cf0 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  ix = (u16)lwr;. 
31d00 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
31d10 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
31d20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31d30 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74  break;.  }.movet
31d40 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72  o_finish:.  pCur
31d50 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
31d60 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
31d70 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
31d80 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
31d90 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
31da0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
31db0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
31dc0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
31dd0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
31de0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
31df0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
31e00 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
31e10 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
31e20 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
31e30 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
31e40 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
31e50 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
31e60 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
31e70 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
31e80 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
31e90 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
31ea0 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
31eb0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
31ec0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
31ed0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
31ee0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
31ef0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
31f00 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
31f10 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
31f20 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
31f30 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
31f40 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
31f50 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
31f60 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
31f70 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
31f80 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
31f90 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
31fa0 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
31fb0 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
31fc0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
31fd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
31fe0 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66  rn an estimate f
31ff0 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
32000 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
32010 6c 65 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  le that pCur is.
32020 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ** pointing to. 
32030 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
32040 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20  ve number if no 
32050 65 73 74 69 6d 61 74 65 20 69 73 20 63 75 72 72  estimate is curr
32060 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61  ently .** availa
32070 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ble..*/.i64 sqli
32080 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74  te3BtreeRowCount
32090 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Est(BtCursor *pC
320a0 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  ur){.  i64 n;.  
320b0 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  u8 i;..  assert(
320c0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
320d0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
320e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
320f0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
32100 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
32110 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72  x) );..  /* Curr
32120 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72  ently this inter
32130 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  face is only cal
32140 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66  led by the OP_If
32150 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63  Smaller.  ** opc
32160 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74  ode, and it that
32170 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72   case the cursor
32180 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
32190 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77  valid and.  ** w
321a0 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74  ill always point
321b0 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e   to a leaf node.
321c0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
321d0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
321e0 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65  RSOR_VALID) ) re
321f0 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e  turn -1;.  if( N
32200 45 56 45 52 28 70 43 75 72 2d 3e 70 50 61 67 65  EVER(pCur->pPage
32210 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74  ->leaf==0) ) ret
32220 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70  urn -1;..  n = p
32230 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
32240 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
32250 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
32260 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72  ){.    n *= pCur
32270 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65  ->apPage[i]->nCe
32280 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ll;.  }.  return
32290 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   n;.}../*.** Adv
322a0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
322b0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
322c0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
322d0 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  e. .** Return va
322e0 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51  lue:.**.**    SQ
322f0 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73  LITE_OK        s
32300 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c  uccess.**    SQL
32310 49 54 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75  ITE_DONE      cu
32320 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
32330 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
32340 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  last element.** 
32350 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
32360 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
32370 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
32380 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
32390 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
323a0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
323b0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
323c0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
323d0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
323e0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
323f0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
32400 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
32410 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
32420 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
32430 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
32440 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
32450 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
32460 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
32470 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
32480 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
32490 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
324a0 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
324b0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
324c0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
324d0 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
324e0 20 46 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73   F argument in s
324f0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
32500 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20  C,F) is 1, then 
32510 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f  the.** cursor co
32520 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
32530 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
32540 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
32550 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b   have been.** sk
32560 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c  ipped if the SQL
32570 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20   index had been 
32580 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
32590 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a   The F argument.
325a0 2a 2a 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  ** is a hint to 
325b0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20  the implement.  
325c0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
325d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
325e0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73   not use.** this
325f0 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42   hint, but COMDB
32600 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  2 does..*/.stati
32610 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
32620 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
32630 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
32640 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
32650 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
32660 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
32670 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
32680 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
32690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
326a0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
326b0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
326c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66  OR_VALID );.  if
326d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
326e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
326f0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
32700 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
32710 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
32720 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   );.    rc = res
32730 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
32740 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
32750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32760 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
32770 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
32780 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
32790 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
327a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
327b0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
327c0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
327d0 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
327e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
327f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
32800 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
32810 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
32820 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
32830 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
32840 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
32850 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
32860 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  Next>0 ){.      
32870 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
32880 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
32890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
328a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
328b0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
328c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
328d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
328e0 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43  ge;.  idx = ++pC
328f0 75 72 2d 3e 69 78 3b 0a 20 20 61 73 73 65 72 74  ur->ix;.  assert
32900 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
32910 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
32920 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
32930 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20   corrupt, it is 
32940 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
32950 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20   value of idx . 
32960 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69   ** to be invali
32970 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e  d here. This can
32980 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61   only occur if a
32990 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d   second cursor m
329a0 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65  odifies.  ** the
329b0 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73   page while curs
329c0 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69  or pCur is holdi
329d0 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
329e0 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a  o it. Which can.
329f0 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e    ** only happen
32a00 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
32a10 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73   is corrupt in s
32a20 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20  uch a way as to 
32a30 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61  link the.  ** pa
32a40 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ge into more tha
32a50 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
32a60 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73  ucture. */.  tes
32a70 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65  tcase( idx>pPage
32a80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66  ->nCell );..  if
32a90 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
32aa0 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
32ab0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
32ac0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
32ad0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
32ae0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
32af0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
32b00 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
32b10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
32b20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
32b30 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
32b40 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
32b50 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
32b60 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
32b70 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
32b80 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
32b90 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
32ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
32bb0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
32bc0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
32bd0 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
32be0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
32bf0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
32c00 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  r->ix>=pPage->nC
32c10 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
32c20 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
32c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
32c40 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
32c50 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ur, 0);.    }els
32c60 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
32c70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
32c80 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
32c90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
32ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
32cc0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
32cd0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
32ce0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
32cf0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
32d00 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Cur, int flags){
32d10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
32d20 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  e;.  UNUSED_PARA
32d30 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20  METER( flags ); 
32d40 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44   /* Used in COMD
32d50 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76  B2 but not nativ
32d60 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73  e SQLite */.  as
32d70 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
32d80 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
32d90 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
32da0 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
32db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
32dc0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
32dd0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
32de0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
32df0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
32e00 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
32e10 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
32e20 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
32e30 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
32e40 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
32e50 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
32e60 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
32e70 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67  xt(pCur);.  pPag
32e80 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
32e90 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
32ea0 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ix)>=pPage->nCel
32eb0 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l ){.    pCur->i
32ec0 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x--;.    return 
32ed0 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b  btreeNext(pCur);
32ee0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
32ef0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
32f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
32f20 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
32f30 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
32f40 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
32f50 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
32f60 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
32f70 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
32f80 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74  database..** Ret
32f90 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  urn values:.**.*
32fa0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  *     SQLITE_OK 
32fb0 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20      success.**  
32fc0 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20     SQLITE_DONE  
32fd0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
32fe0 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66 69  lready on the fi
32ff0 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  rst element of t
33000 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  he table.**     
33010 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 73 6f  otherwise     so
33020 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  me kind of error
33030 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20   occurred.**.** 
33040 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
33050 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
33060 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
33070 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
33080 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
33090 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
330a0 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
330b0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
330c0 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
330d0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
330e0 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
330f0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
33100 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
33110 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
33120 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
33130 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
33140 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
33150 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
33160 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
33170 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
33180 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
33190 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20  .** If bit 0x01 
331a0 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e  of the F argumen
331b0 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  t to sqlite3Btre
331c0 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29 20 69  ePrevious(C,F) i
331d0 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  s 1, then.** the
331e0 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f   cursor correspo
331f0 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
33200 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75  dex and this rou
33210 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
33220 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20  been.** skipped 
33230 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78  if the SQL index
33240 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71   had been a uniq
33250 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46  ue index.  The F
33260 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
33270 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  * hint to the im
33280 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61  plement.  The na
33290 74 69 76 65 20 53 51 4c 69 74 65 20 62 74 72 65  tive SQLite btre
332a0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
332b0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65   does not.** use
332c0 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20   this hint, but 
332d0 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a  COMDB2 does..*/.
332e0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
332f0 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
33300 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
33310 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
33320 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
33330 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
33340 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
33350 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
33360 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
33370 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
33380 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
33390 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
333a0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
333b0 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
333c0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
333d0 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
333e0 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
333f0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
33400 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
33410 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
33420 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
33430 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
33440 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
33450 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
33460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33470 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33480 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
33490 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
334a0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
334b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
334c0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  DONE;.    }.    
334d0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
334e0 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
334f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
33500 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
33510 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
33520 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
33530 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
33540 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
33550 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
33560 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
33570 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
33580 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
33590 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
335a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
335b0 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
335c0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
335d0 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
335e0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
335f0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
33600 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
33610 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
33620 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
33630 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20  r->ix;.    rc = 
33640 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
33650 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
33660 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
33670 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33680 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
33690 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
336a0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
336b0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
336c0 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20  Cur->ix==0 ){.  
336d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
336e0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
336f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
33700 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
33710 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
33720 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
33730 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
33740 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
33750 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
33760 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
33770 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
33780 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
33790 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69  ags & (BTCF_Vali
337a0 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
337b0 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
337c0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
337d0 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  >pPage;.    if( 
337e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
337f0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
33800 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
33810 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
33820 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
33830 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
33840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
33850 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
33860 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
33870 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
33880 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
33890 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
338a0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
338b0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
338c0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
338d0 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
338e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
338f0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
33900 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
33910 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
33920 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
33930 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20  R( flags );  /* 
33940 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62  Used in COMDB2 b
33950 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51  ut not native SQ
33960 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  Lite */.  pCur->
33970 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
33980 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
33990 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
339a0 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
339b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
339c0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
339d0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
339e0 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69  ID.   || pCur->i
339f0 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  x==0.   || pCur-
33a00 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a  >pPage->leaf==0.
33a10 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
33a20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
33a30 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ur);.  }.  pCur-
33a40 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  >ix--;.  return 
33a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
33a60 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
33a70 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
33a80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
33a90 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
33aa0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
33ab0 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
33ac0 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
33ad0 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
33ae0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
33af0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
33b00 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
33b10 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
33b20 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
33b30 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
33b40 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
33b50 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
33b60 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
33b70 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
33b80 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
33b90 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
33ba0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
33bb0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
33bc0 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
33bd0 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
33be0 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
33bf0 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69  rror.  *ppPage i
33c00 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e  s set to NULL in
33c10 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
33c20 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
33c30 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
33c40 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
33c50 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
33c60 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
33c70 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
33c80 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
33c90 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
33ca0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
33cb0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
33cc0 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
33cd0 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
33ce0 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
33cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33d00 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
33d10 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
33d20 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
33d30 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
33d40 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
33d50 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
33d60 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
33d70 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
33d80 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
33d90 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
33da0 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
33db0 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
33dc0 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
33dd0 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
33de0 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
33df0 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
33e00 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
33e10 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
33e20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
33e30 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
33e40 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
33e50 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
33e60 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
33e70 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
33e80 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
33e90 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
33ea0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
33eb0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
33ec0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
33ed0 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
33ee0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
33ef0 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
33f00 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
33f10 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
33f20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
33f30 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
33f40 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
33f50 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
33f60 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
33f70 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
33f80 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
33f90 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
33fa0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
33fb0 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
33fc0 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
33fd0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
33fe0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
33ff0 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
34000 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
34010 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
34020 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
34030 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
34040 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
34050 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
34060 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
34070 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
34080 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
34090 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
340a0 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
340b0 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
340c0 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
340d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
340e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
340f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
34100 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
34110 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
34120 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
34130 72 62 79 3e 30 20 26 26 20 52 45 51 55 49 52 45  rby>0 && REQUIRE
34140 5f 50 54 52 4d 41 50 20 29 20 29 3b 0a 20 20 70  _PTRMAP ) );.  p
34150 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
34160 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
34170 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
34180 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
34190 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
341a0 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
341b0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
341c0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
341d0 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
341e0 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
341f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
34200 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
34210 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
34220 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
34230 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
34240 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
34250 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
34260 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
34270 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34280 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73  T;.  }..  /* Ens
34290 75 72 65 20 70 61 67 65 20 31 20 69 73 20 77 72  ure page 1 is wr
342a0 69 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e  itable. This fun
342b0 63 74 69 6f 6e 20 77 69 6c 6c 20 65 69 74 68 65  ction will eithe
342c0 72 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d  r change the num
342d0 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65  ber.  ** of page
342e0 73 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s in the free-li
342f0 73 74 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  st or the size o
34300 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34310 69 6c 65 2e 20 53 69 6e 63 65 20 62 6f 74 68 0a  ile. Since both.
34320 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20 6f 70    ** of these op
34330 65 72 61 74 69 6f 6e 73 20 69 6e 76 6f 6c 76 65  erations involve
34340 20 6d 6f 64 69 66 79 69 6e 67 20 70 61 67 65 20   modifying page 
34350 31 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2c  1 header fields,
34360 20 70 61 67 65 20 31 0a 20 20 2a 2a 20 77 69 6c   page 1.  ** wil
34370 6c 20 64 65 66 69 6e 69 74 65 6c 79 20 62 65 20  l definitely be 
34380 77 72 69 74 74 65 6e 20 62 79 20 74 68 69 73 20  written by this 
34390 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
343a0 74 68 69 73 20 69 73 20 61 6e 20 43 4f 4e 43 55  this is an CONCU
343b0 52 52 45 4e 54 0a 20 20 2a 2a 20 74 72 61 6e 73  RRENT.  ** trans
343c0 61 63 74 69 6f 6e 2c 20 65 6e 73 75 72 65 20 74  action, ensure t
343d0 68 65 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  he BtreePtrmap s
343e0 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65  tructure has bee
343f0 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f  n allocated.  */
34400 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
34410 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
34420 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
34430 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
34440 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  ;..  if( n>0 ){.
34450 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
34460 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
34470 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
34480 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
34490 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
344a0 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
344b0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
344c0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
344d0 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
344e0 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
344f0 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72  */.    u32 nSear
34500 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75  ch = 0;   /* Cou
34510 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
34520 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d   of search attem
34530 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  pts */.    .    
34540 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41  /* If eMode==BTA
34550 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61  LLOC_EXACT and a
34560 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
34570 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
34580 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
34590 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
345a0 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
345b0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
345c0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
345d0 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
345e0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
345f0 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
34600 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
34610 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
34620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 53        assert( IS
34630 41 55 54 4f 56 41 43 55 55 4d 21 3d 49 53 43 4f  AUTOVACUUM!=ISCO
34640 4e 43 55 52 52 45 4e 54 20 29 3b 0a 20 20 20 20  NCURRENT );.    
34650 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
34660 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  UM ){.        if
34670 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  ( nearby<=mxPage
34680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
34690 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
346a0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
346b0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
346c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
346d0 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
346e0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
346f0 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
34700 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
34710 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
34720 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
34730 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
34740 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
34750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
34760 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
34770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34780 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
34790 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  {.        search
347a0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
347b0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
347c0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
347d0 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63  E ){.      searc
347e0 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d  hList = 1;.    }
347f0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
34800 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
34810 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
34820 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
34830 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
34840 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
34850 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
34860 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
34870 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
34880 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
34890 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
348a0 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
348b0 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
348c0 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
348d0 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
348e0 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
348f0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
34900 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
34910 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
34920 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
34930 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
34940 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
34950 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
34960 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
34970 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
34980 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
34990 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
349a0 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
349b0 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
349c0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
349d0 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
349e0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
349f0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
34a00 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
34a10 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
34a20 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
34a30 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20  01506-11053 The 
34a40 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e  first integer on
34a50 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
34a60 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  k page.        *
34a70 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  * is the page nu
34a80 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
34a90 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
34aa0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
34ab0 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a   or.        ** z
34ac0 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74  ero if this is t
34ad0 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74  he last freelist
34ae0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a   trunk page. */.
34af0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
34b00 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
34b10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
34b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34b30 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
34b40 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31  CE-OF: R-59841-1
34b50 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20  3798 The 4-byte 
34b60 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
34b70 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a  er at offset 32.
34b80 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
34b90 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
34ba0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
34bb0 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c  age of the freel
34bc0 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a  ist, or zero if.
34bd0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
34be0 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
34bf0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
34c00 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
34c10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
34c20 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
34c30 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
34c40 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
34c50 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
34c60 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68  xPage || nSearch
34c70 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20  ++ > n ){.      
34c80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
34c90 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76  RRUPT_PGNO(pPrev
34ca0 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75  Trunk ? pPrevTru
34cb0 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20  nk->pgno : 1);. 
34cc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34cd0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
34ce0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
34cf0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
34d00 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
34d10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
34d20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
34d30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
34d40 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
34d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34d60 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d  assert( pTrunk!=
34d70 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
34d80 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  t( pTrunk->aData
34d90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  !=0 );.      /* 
34da0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
34db0 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73  3523-04394 The s
34dc0 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e  econd integer on
34dd0 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
34de0 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  k page.      ** 
34df0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
34e00 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74   leaf page point
34e10 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a  ers to follow. *
34e20 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  /.      k = get4
34e30 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
34e40 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
34e50 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
34e60 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
34e70 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
34e80 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
34e90 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
34ea0 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
34eb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
34ec0 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
34ed0 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
34ee0 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
34ef0 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
34f00 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
34f10 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
34f20 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
34f30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
34f40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34f50 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
34f60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
34f70 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
34f80 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
34f90 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
34fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
34fb0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
34fc0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
34fd0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
34fe0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
34ff0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
35000 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
35010 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
35020 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
35030 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
35040 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
35050 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
35060 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
35070 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
35080 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
35090 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
350a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
350b0 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
350c0 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
350d0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
350e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
350f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
35100 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  O(iTrunk);.     
35110 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
35120 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
35130 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
35140 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
35150 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
35160 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
35170 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
35180 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
35190 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
351a0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
351b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
351c0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
351d0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
351e0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
351f0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
35200 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
35210 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
35220 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
35230 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
35240 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
35250 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
35260 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
35270 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
35280 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
35290 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
352a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
352b0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
352c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
352d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
352e0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
352f0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
35300 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
35310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
35320 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
35330 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
35340 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
35350 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
35360 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
35370 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
35380 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
35390 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
353a0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
353b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
353c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
353d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
353e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
353f0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
35400 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
35410 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
35420 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
35430 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
35440 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
35450 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35470 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
35480 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
35490 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
354a0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
354b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
354c0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
354d0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
354e0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
354f0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
35500 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
35510 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
35520 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35530 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
35540 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
35550 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
35560 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
35570 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
35580 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
35590 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
355a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
355b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
355c0 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
355d0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
355e0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
355f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
35600 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
35610 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
35620 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
35630 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
35640 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
35650 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
35660 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
35670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35690 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
356a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
356b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
356c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
356d0 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
356e0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
356f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
35700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35710 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
35720 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
35730 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
35740 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
35750 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
35760 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
35770 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
35780 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
35790 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
357a0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
357b0 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
357c0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
357d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
357e0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
357f0 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
35800 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
35810 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
35820 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
35830 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
35840 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
35850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
35860 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
35870 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35880 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
35890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
358a0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
358b0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
358c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
358d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
358e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
358f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
35900 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
35910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
35920 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
35930 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
35940 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
35950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35960 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
35970 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
35980 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
35990 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
359a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
359b0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
359c0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
359d0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
359e0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
359f0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
35a00 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
35a10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
35a20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
35a30 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
35a40 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
35a50 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
35a60 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
35a70 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
35a80 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
35a90 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
35aa0 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
35ab0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
35ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
35ad0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
35ae0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
35af0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
35b00 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
35b10 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
35b20 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
35b30 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
35b40 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
35b50 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
35b60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
35b70 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
35b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
35b90 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
35bb0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
35bc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
35bd0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
35be0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
35bf0 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
35c00 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
35c10 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
35c20 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
35c30 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
35c40 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
35c50 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
35c60 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
35c70 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
35c80 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
35c90 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
35ca0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
35cb0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
35cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35cd0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
35ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
35cf0 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
35d00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35d20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
35d30 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
35d40 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
35d50 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
35d60 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
35d70 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
35d80 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
35d90 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
35da0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
35db0 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
35dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
35dd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35de0 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
35df0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
35e00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
35e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35e20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
35e30 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
35e40 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
35e50 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
35e60 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
35e70 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
35e80 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
35e90 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
35ea0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
35eb0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
35ec0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
35ed0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
35ee0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
35ef0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
35f00 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
35f10 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
35f20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
35f30 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
35f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35f50 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
35f60 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
35f70 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
35f80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35f90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
35fa0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
35fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
35fc0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
35fd0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
35fe0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
35ff0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
36000 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
36010 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
36020 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
36030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
36040 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
36050 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
36060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
36070 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
36080 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
36090 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
360a0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
360b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
360c0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
360d0 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
360e0 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
360f0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
36100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36110 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36120 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36130 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
36140 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
36150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
36160 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36170 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
36180 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
36190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
361a0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
361b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
361c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
361d0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
361e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
361f0 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
36200 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
36210 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
36220 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
36230 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
36240 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36250 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
36260 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
36270 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
36280 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
36290 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
362a0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
362b0 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
362c0 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
362d0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
362e0 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
362f0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
36300 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
36310 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
36320 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
36330 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
36340 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
36350 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
36360 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
36370 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
36380 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
36390 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
363a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
363b0 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
363c0 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
363d0 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
363e0 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
363f0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
36400 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
36410 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
36420 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
36430 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
36440 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
36450 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
36460 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
36470 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
36480 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
36490 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
364a0 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
364b0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
364c0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
364d0 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
364e0 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
364f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
36500 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
36510 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
36520 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
36530 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
36540 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
36550 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
36560 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
36570 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
36580 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
36590 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
365a0 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
365b0 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
365c0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
365d0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
365e0 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
365f0 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
36600 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
36610 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
36620 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
36630 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
36640 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
36650 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
36660 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
36670 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
36680 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
36690 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
366a0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
366b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
366c0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
366d0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
366e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
366f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
36700 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
36710 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
36720 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
36730 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
36740 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
36750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36760 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
36770 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
36780 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
36790 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
367a0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
367b0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
367c0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
367d0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
367e0 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
367f0 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
36800 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
36810 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
36820 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
36830 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
36840 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
36850 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
36860 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
36870 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
36880 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36890 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
368a0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
368b0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
368c0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
368d0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
368e0 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
368f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
36900 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
36910 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
36920 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
36930 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
36940 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
36950 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
36960 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
36970 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36980 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
36990 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
369a0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
369b0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
369c0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
369d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
369e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
369f0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
36a00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
36a10 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
36a20 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
36a30 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
36a40 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
36a50 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
36a60 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
36a70 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
36a80 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
36a90 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
36aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
36ab0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
36ac0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
36ad0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
36ae0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
36af0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
36b00 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
36b10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
36b20 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
36b30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36b40 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
36b50 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
36b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36b70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
36b80 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
36b90 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
36ba0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
36bb0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
36bc0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
36bd0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
36be0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
36bf0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
36c00 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
36c10 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
36c20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
36c30 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
36c40 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
36c50 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
36c60 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
36c70 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
36c80 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
36c90 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
36ca0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
36cb0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
36cc0 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
36cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
36ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
36cf0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
36d00 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
36d10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
36d20 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
36d30 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
36d40 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
36d50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
36d60 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
36d70 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
36d80 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
36d90 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
36da0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
36db0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
36dc0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
36dd0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
36de0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
36df0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
36e00 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
36e10 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
36e20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
36e30 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
36e40 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
36e50 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
36e60 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
36e70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
36e80 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
36e90 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
36ea0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
36eb0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
36ec0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
36ed0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
36ee0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
36ef0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
36f00 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
36f10 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
36f20 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
36f30 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
36f40 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
36f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f60 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
36f70 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
36f80 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
36f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fa0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
36fb0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
36fc0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
36fd0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
36fe0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
36ff0 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
37000 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
37010 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
37020 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
37030 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
37040 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
37050 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
37060 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
37070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37080 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
37090 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
370a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
370b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
370c0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
370d0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
370e0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
370f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
37100 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
37110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
37120 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
37130 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
37140 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
37150 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
37160 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
37170 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
37180 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
37190 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
371a0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
371b0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
371c0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
371d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
371e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
371f0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
37200 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
37210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
37220 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
37230 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
37240 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
37250 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37260 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
37270 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
37280 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
37290 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
372a0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
372b0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
372c0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
372d0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
372e0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
372f0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
37300 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
37310 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
37320 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
37330 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
37340 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
37350 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
37360 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
37370 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
37380 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
37390 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
373a0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
373b0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
373c0 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
373d0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
373e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
373f0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
37400 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
37410 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
37420 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
37430 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
37440 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
37450 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
37460 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
37470 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
37480 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
37490 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
374a0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
374b0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
374c0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
374d0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
374e0 20 2a 2f 0a 20 20 69 66 28 20 52 45 51 55 49 52   */.  if( REQUIR
374f0 45 5f 50 54 52 4d 41 50 20 29 7b 0a 20 20 20 20  E_PTRMAP ){.    
37500 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
37510 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
37520 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
37530 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
37540 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
37550 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
37560 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
37570 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
37580 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
37590 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
375a0 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
375b0 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
375c0 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
375d0 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
375e0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
375f0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
37600 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
37610 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
37620 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
37630 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
37640 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
37650 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
37660 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
37670 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
37680 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
37690 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
376a0 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
376b0 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
376c0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
376d0 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
376e0 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
376f0 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
37700 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
37710 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
37720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37730 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
37740 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
37750 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
37760 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
37770 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
37780 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
37790 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
377a0 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
377b0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
377c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
377d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
377e0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
377f0 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
37800 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
37810 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
37820 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
37830 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
37840 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
37850 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
37860 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
37870 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
37880 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
37890 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
378a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
378b0 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
378c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
378d0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
378e0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
378f0 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
37900 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
37910 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
37920 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
37930 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
37940 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
37950 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
37960 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
37970 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
37980 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
37990 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
379a0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
379b0 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
379c0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
379d0 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
379e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
379f0 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
37a00 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
37a10 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
37a20 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
37a30 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
37a40 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
37a50 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
37a60 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
37a70 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
37a80 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
37a90 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
37aa0 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
37ab0 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
37ac0 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
37ad0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
37ae0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
37af0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
37b00 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
37b10 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
37b20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
37b30 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
37b40 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
37b50 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
37b60 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
37b70 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
37b80 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
37b90 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
37ba0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
37bb0 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
37bc0 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
37bd0 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
37be0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
37bf0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
37c00 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
37c10 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
37c20 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
37c30 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
37c40 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39  IDENCE-OF: R-199
37c50 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72  20-11576 However
37c60 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  , newer versions
37c70 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c   of SQLite still
37c80 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20  .      ** avoid 
37c90 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73  using the last s
37ca0 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ix entries in th
37cb0 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  e freelist trunk
37cc0 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20   page array in. 
37cd0 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68       ** order th
37ce0 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
37cf0 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77  s created by new
37d00 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
37d10 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20  QLite can be.   
37d20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c     ** read by ol
37d30 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
37d40 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f  SQLite..      */
37d50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
37d60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
37d70 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
37d80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37da0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
37db0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
37dc0 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
37dd0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
37de0 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
37df0 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
37e00 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
37e10 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
37e20 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
37e30 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
37e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
37e50 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
37e60 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
37e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
37e80 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
37e90 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
37ea0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
37eb0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
37ec0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
37ed0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
37ee0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
37ef0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
37f00 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
37f10 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
37f20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
37f30 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
37f40 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
37f50 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
37f60 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
37f70 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
37f80 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
37f90 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
37fa0 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
37fb0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
37fc0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
37fd0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
37fe0 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
37ff0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
38000 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
38010 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
38020 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
38030 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
38040 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
38050 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
38060 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
38070 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
38080 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
38090 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
380a0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
380b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
380c0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
380d0 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
380e0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
380f0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
38100 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
38110 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
38120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
38130 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
38140 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
38150 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
38160 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
38170 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
38180 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
38190 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
381a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
381b0 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
381c0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
381d0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
381e0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
381f0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
38200 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
38210 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
38220 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
38230 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
38240 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
38250 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
38260 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
38270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
38280 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
38290 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
382a0 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
382b0 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
382c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
382d0 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
382e0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
382f0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
38300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
38310 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
38320 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
38330 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
38340 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65  .  Store.** size
38350 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
38360 75 74 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70  ut the cell in p
38370 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
38380 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20  int clearCell(. 
38390 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
383a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
383b0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
383c0 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a  ins the Cell */.
383d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
383e0 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69  *pCell,    /* Fi
383f0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
38400 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  Cell */.  CellIn
38410 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
38420 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72     /* Size infor
38430 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
38440 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74   cell */.){.  Bt
38450 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50  Shared *pBt;.  P
38460 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
38470 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
38480 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
38490 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
384a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
384b0 78