/ Hex Artifact Content
Login

Artifact b3d5ea919c2eef869306ec09e1b6e64a8b9fdd7421f93e6913f5c48b51b4ea6c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
1fc0: 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20  to see if Btree 
1fd0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
1fe0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
1ff0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
2000: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
2010: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
2020: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2030: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
2040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
2050: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
2060: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
2070: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
2080: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2090: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
20a0: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
20b0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
20c0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20d0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
20e0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
20f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2100: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2110: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2130: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2140: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2150: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2160: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2170: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2180: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2190: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
21a0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
21b0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c  _ReadUncommit)||
21c0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
21d0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
21e0: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
21f0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2200: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2210: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2220: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2230: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2240: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2250: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2260: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2270: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
2280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
2290: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
22a0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
22b0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
22c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
22d0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
22e0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
22f0: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2300: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2310: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2340: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2350: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2360: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2370: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
2380: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
2390: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
23a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
23c0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
23d0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
23e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23f0: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2400: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2410: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2430: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2440: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2450: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2470: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2480: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2490: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
24a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
24b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
24c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
24d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
24e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
24f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2500: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2510: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2520: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2530: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2540: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2550: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2560: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2570: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2580: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
25b0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
25c0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
25d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
25e0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
25f0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2600: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2610: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2620: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2630: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2640: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2650: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2670: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2680: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2690: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
26a0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
26b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
26c0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
26d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
26e0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
26f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2700: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2710: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2720: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2730: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2750: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2760: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2770: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2780: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2790: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
27a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
27b0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
27c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
27d0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
27e0: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
27f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2810: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2830: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2850: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2870: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2880: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
2890: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
28a0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
28b0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
28c0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
28d0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
28e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
28f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2900: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2910: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2920: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2940: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2950: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2960: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2970: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
2980: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
2990: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
29a0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
29b0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
29c0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
29d0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
29e0: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
29f0: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2a00: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2a10: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2a20: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2a30: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2a40: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2a50: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2a60: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2a70: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
2a80: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
2a90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
2ab0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
2ac0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
2ad0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2ae0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2af0: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2b10: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2b20: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2b30: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2b40: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2b50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b60: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2b70: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2b80: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2b90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ba0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2bb0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2bc0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2bd0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2bf0: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2c10: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2c20: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2c30: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2c40: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2c50: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2c60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2c70: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2c80: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2c90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2ca0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2cb0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2cc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2cd0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2ce0: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2cf0: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2d00: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2d10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2d20: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2d30: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20  E_ReadUncommit) 
2d40: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2d50: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
2d60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2d70: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2d80: 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20  d on a sharable 
2d90: 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20  b-tree after it 
2da0: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64  .  ** has been d
2db0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
2dc0: 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68  o other b-tree h
2dd0: 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69  olds a conflicti
2de0: 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  ng lock.  */.  a
2df0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
2e00: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
2e20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2e30: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
2e40: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
2e50: 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65  First search the
2e60: 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69   list for an exi
2e70: 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68  sting lock on th
2e80: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
2e90: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
2ea0: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
2eb0: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
2ec0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2ed0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
2ee0: 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d  & pIter->pBtree=
2ef0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =p ){.      pLoc
2f00: 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20  k = pIter;.     
2f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
2f30: 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20  bove search did 
2f40: 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63  not find a BtLoc
2f50: 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61  k struct associa
2f60: 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a  ting Btree p.  *
2f70: 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61  * with table iTa
2f80: 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e  ble, allocate on
2f90: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
2fa0: 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a  to the list..  *
2fb0: 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  /.  if( !pLock )
2fc0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42  {.    pLock = (B
2fd0: 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d  tLock *)sqlite3M
2fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
2ff0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
3000: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
3010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3020: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
3030: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3040: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3050: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3060: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3070: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3080: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3090: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
30a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3100: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3110: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3120: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3130: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3140: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3150: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3160: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3170: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3180: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3190: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
31a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3210: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3220: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3230: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3240: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3250: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3260: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3270: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3280: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3290: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
32a0: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32e0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32f0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
3300: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3310: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3320: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3330: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3340: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3350: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3360: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3370: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3380: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3390: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33b0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33c0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33f0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
3400: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3410: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3420: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3430: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3440: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3450: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3460: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3470: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3480: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3490: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
34a0: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34b0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34c0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34d0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34e0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34f0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
3500: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3510: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3520: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3530: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3540: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3550: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3560: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3570: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3590: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
35a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35e0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35f0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
3600: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3610: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3620: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3630: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3640: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3650: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3660: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3670: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3680: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3690: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
36a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36c0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36d0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36f0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
3700: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3710: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3720: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3730: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3740: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3760: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3770: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3780: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3790: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
37a0: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37b0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37c0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37e0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37f0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
3800: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3810: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3820: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3830: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3840: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3850: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3860: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3870: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
38a0: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38b0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38c0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3900: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3910: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3920: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3930: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3940: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3950: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3960: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3980: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3990: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
39a0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39c0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39f0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3a00: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a10: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a20: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a30: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a60: 43 48 45 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  CHE */...#ifndef
3a70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
3a80: 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68  CURRENT./*.** Th
3a90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3aa0: 63 74 75 72 65 20 2d 20 42 74 72 65 65 50 74 72  cture - BtreePtr
3ab0: 6d 61 70 20 2d 20 73 74 6f 72 65 73 20 74 68 65  map - stores the
3ac0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 6f 69 6e 74   in-memory point
3ad0: 65 72 20 6d 61 70 0a 2a 2a 20 75 73 65 64 20 66  er map.** used f
3ae0: 6f 72 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  or newly allocat
3af0: 65 64 20 70 61 67 65 73 20 69 6e 20 43 4f 4e 43  ed pages in CONC
3b00: 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69  URRENT transacti
3b10: 6f 6e 73 2e 20 53 75 63 68 20 70 61 67 65 73 20  ons. Such pages 
3b20: 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 61 6c  are.** always al
3b30: 6c 6f 63 61 74 65 64 20 69 6e 20 61 20 63 6f 6e  located in a con
3b40: 74 69 67 75 6f 75 73 20 62 6c 6f 63 6b 20 28 66  tiguous block (f
3b50: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
3b60: 68 65 20 66 69 6c 65 29 20 73 74 61 72 74 69 6e  he file) startin
3b70: 67 0a 2a 2a 20 77 69 74 68 20 70 61 67 65 20 42  g.** with page B
3b80: 74 72 65 65 50 74 72 6d 61 70 2e 69 46 69 72 73  treePtrmap.iFirs
3b90: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
3ba0: 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e 74  ruct RollbackEnt
3bb0: 72 79 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79  ry RollbackEntry
3bc0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
3bd0: 20 50 74 72 6d 61 70 45 6e 74 72 79 20 50 74 72   PtrmapEntry Ptr
3be0: 6d 61 70 45 6e 74 72 79 3b 0a 73 74 72 75 63 74  mapEntry;.struct
3bf0: 20 50 74 72 6d 61 70 45 6e 74 72 79 20 7b 0a 20   PtrmapEntry {. 
3c00: 20 50 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20 20   Pgno parent;.  
3c10: 75 38 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74 72  u8 eType;.};.str
3c20: 75 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72  uct RollbackEntr
3c30: 79 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  y {.  Pgno pgno;
3c40: 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74 3b 0a  .  Pgno parent;.
3c50: 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b 0a 73    u8 eType;.};.s
3c60: 74 72 75 63 74 20 42 74 72 65 65 50 74 72 6d 61  truct BtreePtrma
3c70: 70 20 7b 0a 20 20 50 67 6e 6f 20 69 46 69 72 73  p {.  Pgno iFirs
3c80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3c90: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e        /* First n
3ca0: 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ew page number a
3cb0: 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20 20 69 6e 74  Ptr[0] */..  int
3cc0: 20 6e 50 74 72 41 6c 6c 6f 63 3b 20 20 20 20 20   nPtrAlloc;     
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ce0: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
3cf0: 66 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 2a  f aPtr[] array *
3d00: 2f 0a 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20  /.  PtrmapEntry 
3d10: 2a 61 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  *aPtr;          
3d20: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
3d30: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
3d40: 65 72 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53  ers */..  int nS
3d50: 76 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  vpt;            
3d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
3d70: 64 20 73 69 7a 65 20 6f 66 20 61 53 76 70 74 5b  d size of aSvpt[
3d80: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
3d90: 20 6e 53 76 70 74 41 6c 6c 6f 63 3b 20 20 20 20   nSvptAlloc;    
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3db0: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
3dc0: 66 20 61 53 76 70 74 5b 5d 20 2a 2f 0a 20 20 69  f aSvpt[] */.  i
3dd0: 6e 74 20 2a 61 53 76 70 74 3b 20 20 20 20 20 20  nt *aSvpt;      
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3df0: 2a 20 46 69 72 73 74 20 61 52 6f 6c 6c 62 61 63  * First aRollbac
3e00: 6b 5b 5d 20 65 6e 74 72 79 20 66 6f 72 20 73 61  k[] entry for sa
3e10: 76 65 70 6f 69 6e 74 20 69 20 2a 2f 0a 0a 20 20  vepoint i */..  
3e20: 69 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b 3b 20 20  int nRollback;  
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 2f 2a 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20  /* Used size of 
3e50: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
3e60: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c  y */.  int nRoll
3e70: 62 61 63 6b 41 6c 6c 6f 63 3b 20 20 20 20 20 20  backAlloc;      
3e80: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
3e90: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 6c  ted size of aRol
3ea0: 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79 20 2a 2f  lback[] array */
3eb0: 0a 20 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79  .  RollbackEntry
3ec0: 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20   *aRollback;    
3ed0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
3ee0: 6f 6c 6c 62 61 63 6b 20 65 6e 74 72 69 65 73 20  ollback entries 
3ef0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64 65 66 69 6e  */.};../* !defin
3f00: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
3f10: 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
3f20: 20 49 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20   If page number 
3f30: 70 67 6e 6f 20 69 73 20 67 72 65 61 74 65 72 20  pgno is greater 
3f40: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
3f50: 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69 46 69   BtreePtrmap.iFi
3f60: 72 73 74 2c 20 0a 2a 2a 20 73 74 6f 72 65 20 61  rst, .** store a
3f70: 6e 20 65 6e 74 72 79 20 66 6f 72 20 69 74 20 69  n entry for it i
3f80: 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
3f90: 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  p structure..*/.
3fa0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
3fb0: 50 74 72 6d 61 70 53 74 6f 72 65 28 0a 20 20 42  PtrmapStore(.  B
3fc0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 0a 20 20  tShared *pBt,.  
3fd0: 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20 20 75 38 20  Pgno pgno,.  u8 
3fe0: 65 54 79 70 65 2c 20 0a 20 20 50 67 6e 6f 20 70  eType, .  Pgno p
3ff0: 61 72 65 6e 74 0a 29 7b 0a 20 20 42 74 72 65 65  arent.){.  Btree
4000: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4010: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4020: 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e 69 46 69 72  pgno>=pMap->iFir
4030: 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 45  st ){.    int iE
4040: 6e 74 72 79 20 3d 20 70 67 6e 6f 20 2d 20 70 4d  ntry = pgno - pM
4050: 61 70 2d 3e 69 46 69 72 73 74 3b 0a 0a 20 20 20  ap->iFirst;..   
4060: 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 61 50 74   /* Grow the aPt
4070: 72 5b 5d 20 61 72 72 61 79 20 61 73 20 72 65 71  r[] array as req
4080: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 77 68 69  uired */.    whi
4090: 6c 65 28 20 69 45 6e 74 72 79 3e 3d 70 4d 61 70  le( iEntry>=pMap
40a0: 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 29 7b 0a 20  ->nPtrAlloc ){. 
40b0: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
40c0: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
40d0: 3f 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f  ? pMap->nPtrAllo
40e0: 63 2a 32 20 3a 20 31 36 3b 0a 20 20 20 20 20 20  c*2 : 16;.      
40f0: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 61 4e 65  PtrmapEntry *aNe
4100: 77 20 3d 20 28 50 74 72 6d 61 70 45 6e 74 72 79  w = (PtrmapEntry
4110: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
4120: 63 28 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  c(.          pMa
4130: 70 2d 3e 61 50 74 72 2c 20 6e 4e 65 77 2a 73 69  p->aPtr, nNew*si
4140: 7a 65 6f 66 28 50 74 72 6d 61 70 45 6e 74 72 79  zeof(PtrmapEntry
4150: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
4160: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4170: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4180: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
41a0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
41b0: 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  New-pMap->nPtrAl
41c0: 6c 6f 63 29 2a 73 69 7a 65 6f 66 28 50 74 72 6d  loc)*sizeof(Ptrm
41d0: 61 70 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20  apEntry);.      
41e0: 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
41f0: 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 5d 2c  Map->nPtrAlloc],
4200: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
4210: 20 20 20 20 70 4d 61 70 2d 3e 61 50 74 72 20 3d      pMap->aPtr =
4220: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   aNew;.        p
4230: 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3d  Map->nPtrAlloc =
4240: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4250: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
4260: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
4270: 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 69 66   rollback log if
4280: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4290: 20 69 66 28 20 70 4d 61 70 2d 3e 6e 53 76 70 74   if( pMap->nSvpt
42a0: 3e 30 20 26 26 20 70 4d 61 70 2d 3e 61 50 74 72  >0 && pMap->aPtr
42b0: 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 20  [iEntry].parent 
42c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 61  ){.      if( pMa
42d0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 3e 3d 70 4d  p->nRollback>=pM
42e0: 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c  ap->nRollbackAll
42f0: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  oc ){.        in
4300: 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e 6e  t nNew = pMap->n
4310: 52 6f 6c 6c 62 61 63 6b 20 3f 20 70 4d 61 70 2d  Rollback ? pMap-
4320: 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32 20 3a 20 31  >nRollback*2 : 1
4330: 36 3b 0a 20 20 20 20 20 20 20 20 52 6f 6c 6c 62  6;.        Rollb
4340: 61 63 6b 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d  ackEntry *aNew =
4350: 20 28 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 2a   (RollbackEntry*
4360: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
4370: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  (.            pM
4380: 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 2c 20 6e  ap->aRollback, n
4390: 4e 65 77 2a 73 69 7a 65 6f 66 28 52 6f 6c 6c 62  New*sizeof(Rollb
43a0: 61 63 6b 45 6e 74 72 79 29 0a 20 20 20 20 20 20  ackEntry).      
43b0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
43c0: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
43d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
43e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
43f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4400: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4410: 61 63 6b 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  ack = aNew;.    
4420: 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c        pMap->nRol
4430: 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d 20 6e 4e 65  lbackAlloc = nNe
4440: 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
4450: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4d 61 70     }..      pMap
4460: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70  ->aRollback[pMap
4470: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 67 6e  ->nRollback].pgn
4480: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  o = pgno;.      
4490: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
44a0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
44b0: 2e 70 61 72 65 6e 74 20 3d 20 70 4d 61 70 2d 3e  .parent = pMap->
44c0: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
44d0: 65 6e 74 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d  ent;.      pMap-
44e0: 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d  >aRollback[pMap-
44f0: 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 65 54 79 70  >nRollback].eTyp
4500: 65 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69  e = pMap->aPtr[i
4510: 45 6e 74 72 79 5d 2e 65 54 79 70 65 3b 0a 20 20  Entry].eType;.  
4520: 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62      pMap->nRollb
4530: 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ack++;.    }..  
4540: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
4550: 61 50 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  aPtr[] array */.
4560: 20 20 20 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69      pMap->aPtr[i
4570: 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 20 3d 20  Entry].parent = 
4580: 70 61 72 65 6e 74 3b 0a 20 20 20 20 70 4d 61 70  parent;.    pMap
4590: 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 65  ->aPtr[iEntry].e
45a0: 54 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20  Type = eType;.  
45b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
45c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65  TE_OK;.}../* !de
45d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
45e0: 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a  T_CONCURRENT).**
45f0: 0a 2a 2a 20 4f 70 65 6e 20 73 61 76 65 70 6f 69  .** Open savepoi
4600: 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 69  nt iSavepoint, i
4610: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
4620: 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61  ady open..*/.sta
4630: 74 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72  tic int btreePtr
4640: 6d 61 70 42 65 67 69 6e 28 42 74 53 68 61 72 65  mapBegin(BtShare
4650: 64 20 2a 70 42 74 2c 20 69 6e 74 20 6e 53 76 70  d *pBt, int nSvp
4660: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
4670: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
4680: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
4690: 26 26 20 6e 53 76 70 74 3e 70 4d 61 70 2d 3e 6e  && nSvpt>pMap->n
46a0: 53 76 70 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Svpt ){.    int 
46b0: 69 3b 0a 20 20 20 20 69 66 28 20 6e 53 76 70 74  i;.    if( nSvpt
46c0: 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c  >=pMap->nSvptAll
46d0: 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  oc ){.      int 
46e0: 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 53 76  nNew = pMap->nSv
46f0: 70 74 41 6c 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e  ptAlloc ? pMap->
4700: 6e 53 76 70 74 41 6c 6c 6f 63 2a 32 20 3a 20 31  nSvptAlloc*2 : 1
4710: 36 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  6;.      int *aN
4720: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
4730: 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61 53 76 70 74  lloc(pMap->aSvpt
4740: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20  , sizeof(int) * 
4750: 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  nNew);.      if(
4760: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
4770: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4780: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
4790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
47a0: 61 70 2d 3e 61 53 76 70 74 20 3d 20 61 4e 65 77  ap->aSvpt = aNew
47b0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e  ;.        pMap->
47c0: 6e 53 76 70 74 41 6c 6c 6f 63 20 3d 20 6e 4e 65  nSvptAlloc = nNe
47d0: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
47e0: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 70 4d 61 70  ..    for(i=pMap
47f0: 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e 53 76 70 74  ->nSvpt; i<nSvpt
4800: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d  ; i++){.      pM
4810: 61 70 2d 3e 61 53 76 70 74 5b 69 5d 20 3d 20 70  ap->aSvpt[i] = p
4820: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 3b 0a  Map->nRollback;.
4830: 20 20 20 20 7d 0a 20 20 20 20 70 4d 61 70 2d 3e      }.    pMap->
4840: 6e 53 76 70 74 20 3d 20 6e 53 76 70 74 3b 0a 20  nSvpt = nSvpt;. 
4850: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
4860: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64  ITE_OK;.}../* !d
4870: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4880: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
4890: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 28 69  *.** Rollback (i
48a0: 66 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  f op==SAVEPOINT_
48b0: 52 4f 4c 4c 42 41 43 4b 29 20 6f 72 20 72 65 6c  ROLLBACK) or rel
48c0: 65 61 73 65 20 28 69 66 20 6f 70 3d 3d 53 41 56  ease (if op==SAV
48d0: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 0a  EPOINT_RELEASE).
48e0: 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 53 76  ** savepoint iSv
48f0: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
4900: 69 64 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e  id btreePtrmapEn
4910: 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  d(BtShared *pBt,
4920: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 76   int op, int iSv
4930: 70 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d  pt){.  BtreePtrm
4940: 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
4950: 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70  pMap;.  if( pMap
4960: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4970: 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
4980: 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70 3d 3d 53 41  LLBACK || op==SA
4990: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
49a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
49b0: 53 76 70 74 3e 3d 30 20 7c 7c 20 28 69 53 76 70  Svpt>=0 || (iSvp
49c0: 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
49d0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
49e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53 76 70   );.    if( iSvp
49f0: 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4d 61  t<0 ){.      pMa
4a00: 70 2d 3e 6e 53 76 70 74 20 3d 20 30 3b 0a 20 20  p->nSvpt = 0;.  
4a10: 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62      pMap->nRollb
4a20: 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  ack = 0;.      m
4a30: 65 6d 73 65 74 28 70 4d 61 70 2d 3e 61 50 74 72  emset(pMap->aPtr
4a40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f  , 0, sizeof(Pgno
4a50: 29 20 2a 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  ) * pMap->nPtrAl
4a60: 6c 6f 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  loc);.    }else 
4a70: 69 66 28 20 69 53 76 70 74 3c 70 4d 61 70 2d 3e  if( iSvpt<pMap->
4a80: 6e 53 76 70 74 20 29 7b 0a 20 20 20 20 20 20 69  nSvpt ){.      i
4a90: 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
4aa0: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
4ab0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
4ac0: 20 20 20 20 20 66 6f 72 28 69 69 3d 70 4d 61 70       for(ii=pMap
4ad0: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d 31 3b 20 69  ->nRollback-1; i
4ae0: 69 3e 3d 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69  i>=pMap->aSvpt[i
4af0: 53 76 70 74 5d 3b 20 69 69 2d 2d 29 7b 0a 20 20  Svpt]; ii--){.  
4b00: 20 20 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b          Rollback
4b10: 45 6e 74 72 79 20 2a 70 20 3d 20 26 70 4d 61 70  Entry *p = &pMap
4b20: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 69 69 5d 3b  ->aRollback[ii];
4b30: 0a 20 20 20 20 20 20 20 20 20 20 50 74 72 6d 61  .          Ptrma
4b40: 70 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 20 3d  pEntry *pEntry =
4b50: 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b 70 2d 3e   &pMap->aPtr[p->
4b60: 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e 69 46 69  pgno - pMap->iFi
4b70: 72 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  rst];.          
4b80: 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 20 3d  pEntry->parent =
4b90: 20 70 2d 3e 70 61 72 65 6e 74 3b 0a 20 20 20 20   p->parent;.    
4ba0: 20 20 20 20 20 20 70 45 6e 74 72 79 2d 3e 65 54        pEntry->eT
4bb0: 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a  ype = p->eType;.
4bc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4bd0: 7d 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 53  }.      pMap->nS
4be0: 76 70 74 20 3d 20 69 53 76 70 74 20 2b 20 28 6f  vpt = iSvpt + (o
4bf0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
4c00: 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 70 4d  LBACK);.      pM
4c10: 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3d 20  ap->nRollback = 
4c20: 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53 76 70  pMap->aSvpt[iSvp
4c30: 74 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t];.    }.  }.}.
4c40: 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c  ./* !defined(SQL
4c50: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
4c60: 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ENT).**.** This 
4c70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4c80: 65 64 20 61 66 74 65 72 20 61 6e 20 43 4f 4e 43  ed after an CONC
4c90: 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69  URRENT transacti
4ca0: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  on is opened on 
4cb0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  the.** database.
4cc0: 20 49 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68   It allocates th
4cd0: 65 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74  e BtreePtrmap st
4ce0: 72 75 63 74 75 72 65 20 75 73 65 64 20 74 6f 20  ructure used to 
4cf0: 74 72 61 63 6b 20 70 6f 69 6e 74 65 72 73 0a 2a  track pointers.*
4d00: 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 70  * to allocated p
4d10: 61 67 65 73 20 61 6e 64 20 7a 65 72 6f 65 73 20  ages and zeroes 
4d20: 74 68 65 20 6e 46 72 65 65 2f 69 54 72 75 6e 6b  the nFree/iTrunk
4d30: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 64   fields in the d
4d40: 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 65 61 64  atabase .** head
4d50: 65 72 20 6f 6e 20 70 61 67 65 20 31 2e 0a 2a 2f  er on page 1..*/
4d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4d70: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
4d80: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4d90: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4da0: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 42 74 2d  E_OK;.  if( pBt-
4db0: 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  >pMap==0 ){.    
4dc0: 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61  BtreePtrmap *pMa
4dd0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
4de0: 6f 63 28 73 69 7a 65 6f 66 28 42 74 72 65 65 50  oc(sizeof(BtreeP
4df0: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 69 66 28  trmap));.    if(
4e00: 20 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20   pMap==0 ){.    
4e10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4e20: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
4e30: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 42        memset(&pB
4e40: 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
4e50: 5b 33 32 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  [32], 0, sizeof(
4e60: 75 33 32 29 2a 32 29 3b 0a 20 20 20 20 20 20 6d  u32)*2);.      m
4e70: 65 6d 73 65 74 28 70 4d 61 70 2c 20 30 2c 20 73  emset(pMap, 0, s
4e80: 69 7a 65 6f 66 28 42 74 72 65 65 50 74 72 6d 61  izeof(BtreePtrma
4e90: 70 29 29 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d  p));.      pMap-
4ea0: 3e 69 46 69 72 73 74 20 3d 20 70 42 74 2d 3e 6e  >iFirst = pBt->n
4eb0: 50 61 67 65 20 2b 20 31 3b 0a 20 20 20 20 20 20  Page + 1;.      
4ec0: 70 42 74 2d 3e 70 4d 61 70 20 3d 20 70 4d 61 70  pBt->pMap = pMap
4ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4ee0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21  turn rc;.}../* !
4ef0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4f00: 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a  MIT_CONCURRENT).
4f10: 2a 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 42  **.** Free any B
4f20: 74 72 65 65 50 74 72 6d 61 70 20 73 74 72 75 63  treePtrmap struc
4f30: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 62  ture allocated b
4f40: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
4f50: 6c 20 74 6f 0a 2a 2a 20 62 74 72 65 65 50 74 72  l to.** btreePtr
4f60: 6d 61 70 41 6c 6c 6f 63 61 74 65 28 29 2e 0a 2a  mapAllocate()..*
4f70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4f80: 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65 28  reePtrmapDelete(
4f90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4fa0: 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70    BtreePtrmap *p
4fb0: 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b  Map = pBt->pMap;
4fc0: 0a 20 20 69 66 28 20 70 4d 61 70 20 29 7b 0a 20  .  if( pMap ){. 
4fd0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4fe0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 29  pMap->aRollback)
4ff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
5000: 65 65 28 70 4d 61 70 2d 3e 61 50 74 72 29 3b 0a  ee(pMap->aPtr);.
5010: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5020: 28 70 4d 61 70 2d 3e 61 53 76 70 74 29 3b 0a 20  (pMap->aSvpt);. 
5030: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5040: 70 4d 61 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pMap);.    pBt->
5050: 70 4d 61 70 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pMap = 0;.  }.}.
5060: 23 65 6c 73 65 20 20 2f 2a 20 53 51 4c 49 54 45  #else  /* SQLITE
5070: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
5080: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 62 74 72   */.# define btr
5090: 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65  eePtrmapAllocate
50a0: 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (x) SQLITE_OK.# 
50b0: 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d  define btreePtrm
50c0: 61 70 44 65 6c 65 74 65 28 78 29 20 0a 23 20 64  apDelete(x) .# d
50d0: 65 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61  efine btreePtrma
50e0: 70 42 65 67 69 6e 28 78 2c 79 29 20 20 53 51 4c  pBegin(x,y)  SQL
50f0: 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20  ITE_OK.# define 
5100: 62 74 72 65 65 50 74 72 6d 61 70 45 6e 64 28 78  btreePtrmapEnd(x
5110: 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 20 2f 2a  ,y,z) .#endif /*
5120: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
5130: 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 73 74 61 74  CURRENT */..stat
5140: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
5150: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
5160: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
5170: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
5180: 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75  *.***** This rou
5190: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
51a0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
51b0: 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  only ****.**.** 
51c0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
51d0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65  cursor holds the
51e0: 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74   mutex on its Bt
51f0: 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66  Shared.*/.#ifdef
5200: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
5210: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
5220: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
5230: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
5240: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5250: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
5260: 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66 79  x);.}../* Verify
5270: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
5280: 20 61 6e 64 20 74 68 65 20 42 74 53 68 61 72 65   and the BtShare
5290: 64 20 61 67 72 65 65 20 61 62 6f 75 74 20 77 68  d agree about wh
52a0: 61 74 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  at is the curren
52b0: 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  t.** database co
52c0: 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20 69 73  nnetion. This is
52d0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 73 68   important in sh
52e0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e  ared-cache mode.
52f0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
5300: 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
5310: 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f 75 74  pointers get out
5320: 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69 73 20  -of-sync, it is 
5330: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 6f 75  possible for rou
5340: 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20 62 74  tines like.** bt
5350: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f  reeInitPage() to
5360: 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20 73 74   reference an st
5370: 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ale connection p
5380: 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65 66 65  ointer that refe
5390: 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20 63 6f  rences a.** a co
53a0: 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nnection that ha
53b0: 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73 65 64  s already closed
53c0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
53d0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 61  is used inside a
53e0: 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
53f0: 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64 20 66  ments only and f
5400: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
5410: 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 69 6e  f double-checkin
5420: 67 20 74 68 61 74 20 74 68 65 20 62 74 72 65 65  g that the btree
5430: 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20 6b 65   code.** does ke
5440: 65 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ep the database 
5450: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
5460: 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  ers up-to-date..
5470: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  */.static int cu
5480: 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
5490: 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
54a0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
54b0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
54c0: 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
54d0: 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d  ree->db==p->pBt-
54e0: 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  >db);.}.#endif..
54f0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
5500: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
5510: 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  che of the curso
5520: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
5530: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
5540: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
5550: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
5560: 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   pBt..*/.#define
5570: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
5580: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20 28  lowCache(pCur) (
5590: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
55a0: 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  = ~BTCF_ValidOvf
55b0: 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  l)../*.** Invali
55c0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
55d0: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
55e0: 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72  e for all cursor
55f0: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74  s opened.** on t
5600: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
5610: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
5620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
5630: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
5640: 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65  lowCache(BtShare
5650: 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
5660: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5670: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5680: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
5690: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
56a0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
56b0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
56c0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
56d0: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
56e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
56f0: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
5700: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5710: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
5720: 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
5730: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74   contents of a t
5740: 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c  able.** to inval
5750: 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
5760: 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ob cursors that 
5770: 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
5780: 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66  ** row or one of
5790: 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20   the rows being 
57a0: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
57b0: 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  If argument isCl
57c0: 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75 65  earTable is true
57d0: 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  , then the entir
57e0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
57f0: 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62  e.** table is ab
5800: 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65  out to be delete
5810: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
5820: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69  invalidate all i
5830: 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f  ncrblob.** curso
5840: 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72  rs open on any r
5850: 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  ow within the ta
5860: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
5870: 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a  ge pgnoRoot..**.
5880: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
5890: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
58a0: 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c  rTable is false,
58b0: 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69   then the row wi
58c0: 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77  th.** rowid iRow
58d0: 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63   is being replac
58e0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  ed or deleted. I
58f0: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
5900: 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74  lidate.** only t
5910: 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75  hose incrblob cu
5920: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
5930: 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e  at specific row.
5940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5950: 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
5960: 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72  obCursors(.  Btr
5970: 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20  ee *pBtree,     
5980: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
5990: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65  base file to che
59a0: 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ck */.  Pgno pgn
59b0: 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  oRoot,          
59c0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
59d0: 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67  t might be chang
59e0: 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ing */.  i64 iRo
59f0: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
5a00: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
5a10: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
5a20: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
5a30: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
5a40: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
5a50: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
5a60: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
5a70: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
5a80: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
5a90: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
5aa0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
5ab0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
5ac0: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
5ad0: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
5ae0: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
5af0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
5b00: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
5b10: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5b20: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
5b30: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
5b40: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
5b50: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
5b60: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
5b70: 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
5b80: 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20 26 26 20  ot==pgnoRoot && 
5b90: 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c  (isClearTable ||
5ba0: 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
5bb0: 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Row) ){.        
5bc0: 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
5bd0: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
5be0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
5bf0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
5c00: 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49   function when I
5c10: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
5c20: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
5c30: 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
5c40: 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c 79 2c  obCursors(w,x,y,
5c50: 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
5c60: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
5c70: 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  B */../*.** Set 
5c80: 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  bit pgno of the 
5c90: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
5ca0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
5cb0: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  s is called .** 
5cc0: 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74  when a page that
5cd0: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74   previously cont
5ce0: 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d  ained data becom
5cf0: 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  es a free-list l
5d00: 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a  eaf .** page..**
5d10: 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64  .** The BtShared
5d20: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5d30: 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f  vec exists to wo
5d40: 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73  rk around an obs
5d50: 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73  cure.** bug caus
5d60: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61  ed by the intera
5d70: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65  ction of two use
5d80: 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74  ful IO optimizat
5d90: 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ions surrounding
5da0: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  .** free-list le
5db0: 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20  af pages:.**.** 
5dc0: 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61    1) When all da
5dd0: 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ta is deleted fr
5de0: 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68  om a page and th
5df0: 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a  e page becomes.*
5e00: 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69  *      a free-li
5e10: 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68  st leaf page, th
5e20: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72  e page is not wr
5e30: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
5e40: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61  abase.**      (a
5e50: 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  s free-list leaf
5e60: 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e   pages contain n
5e70: 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74  o meaningful dat
5e80: 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a  a). Sometimes.**
5e90: 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67        such a pag
5ea0: 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f  e is not even jo
5eb0: 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20  urnalled (as it 
5ec0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69  will not be modi
5ed0: 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68  fied,.**      wh
5ee0: 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  y bother journal
5ef0: 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a  ling it?)..**.**
5f00: 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65     2) When a fre
5f10: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
5f20: 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20   is reused, its 
5f30: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72  content is not r
5f40: 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
5f50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
5f60: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
5f70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68  journal file (wh
5f80: 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20  y should it.**  
5f90: 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73      be, if it is
5fa0: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e   not at all mean
5fb0: 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ingful?)..**.** 
5fc0: 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74  By themselves, t
5fd0: 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
5fe0: 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64  ns work fine and
5ff0: 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79   provide a handy
6000: 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
6010: 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65  boost to bulk de
6020: 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f  lete or insert o
6030: 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76  perations. Howev
6040: 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65  er, if.** a page
6050: 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   is moved to the
6060: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74   free-list and t
6070: 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69  hen reused withi
6080: 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72  n the same.** tr
6090: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f  ansaction, a pro
60a0: 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49  blem comes up. I
60b0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
60c0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
60d0: 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64  n.** it is moved
60e0: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
60f0: 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f  t and it is also
6100: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
6110: 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78  when it.** is ex
6120: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
6130: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72   free-list and r
6140: 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20  eused, then the 
6150: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a  original data.**
6160: 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e   may be lost. In
6170: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
6180: 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79  rollback, it may
6190: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
61a0: 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
61c0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
61d0: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  iguration..**.**
61e0: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
61f0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
6200: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
6210: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67  . Whenever a pag
6220: 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74  e is .** moved t
6230: 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d  o become a free-
6240: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
6250: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
6260: 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20  g bit is.** set 
6270: 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57  in the bitvec. W
6280: 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70  henever a leaf p
6290: 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64  age is extracted
62a0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
62b0: 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  ist,.** optimiza
62c0: 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20  tion 2 above is 
62d0: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  omitted if the c
62e0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
62f0: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
6300: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
6310: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
6320: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
6330: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
6340: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
6350: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
6360: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
6370: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
6380: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
6390: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
63a0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
63b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
63c0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
63d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
63e0: 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65  pgno<=pBt->nPage
63f0: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61   );.    pBt->pHa
6400: 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74  sContent = sqlit
6410: 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
6420: 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
6430: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
6440: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
6450: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6460: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
6470: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6480: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
6490: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
64a0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
64b0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
64c0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
64d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
64e0: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
64f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6500: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
6510: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
6520: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
6530: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6540: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
6550: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
6560: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
6570: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
6580: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
6590: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
65a0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
65b0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
65c0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
65d0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
65e0: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
65f0: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
6600: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
6610: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
6620: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
6630: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
6640: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
6650: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
6660: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
6670: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
6680: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
6690: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
66a0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
66b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
66c0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
66d0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
66e0: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
66f0: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
6700: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
6710: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
6720: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6740: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
6750: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
6760: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
6770: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
6780: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
6790: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
67a0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
67b0: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20   Release all of 
67c0: 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67  the apPage[] pag
67d0: 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e  es for a cursor.
67e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
67f0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6800: 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75 72  ursorPages(BtCur
6810: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6820: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
6830: 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
6840: 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
6850: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
6860: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72  ge[i]);.    pCur
6870: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
6880: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61  .  }.  pCur->iPa
6890: 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ge = -1;.}../*.*
68a0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
68b0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
68c0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
68d0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
68e0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
68f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
6900: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
6910: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
6920: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
6930: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
6940: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6950: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
6960: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
6970: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
6980: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
6990: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
69a0: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
69b0: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
69c0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
69d0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
69e0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
69f0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
6a00: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
6a10: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
6a20: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
6a30: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
6a40: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
6a50: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
6a60: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
6a70: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
6a80: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
6a90: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
6aa0: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
6ab0: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
6ac0: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
6ad0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
6ae0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
6af0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
6b00: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
6b10: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
6b20: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
6b30: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
6b40: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
6b50: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
6b60: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
6b70: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
6b80: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
6b90: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
6ba0: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
6bb0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
6bc0: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
6bd0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
6be0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
6bf0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
6c00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
6c10: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
6c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
6c30: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
6c40: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
6c50: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
6c60: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
6c70: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
6c80: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
6c90: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
6ca0: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
6cb0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
6cc0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
6cd0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
6ce0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6cf0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
6d00: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
6d10: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
6d20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6d30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
6d40: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
6d50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
6d70: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
6d80: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6d90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6da0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
6db0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6dc0: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
6dd0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
6de0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
6df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
6e00: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6e10: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
6e20: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
6e30: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
6e40: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
6e50: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
6e60: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
6e70: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
6e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
6e90: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
6ea0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
6eb0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
6ec0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6ed0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
6ee0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
6ef0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
6f00: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
6f10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
6f20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
6f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
6f40: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
6f50: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
6f60: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
6f70: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
6f80: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
6f90: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
6fa0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
6fb0: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
6fc0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
6fd0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6fe0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
6ff0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
7000: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
7010: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
7020: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
7030: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
7040: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
7050: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7060: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
7070: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
7080: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
7090: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
70a0: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
70b0: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
70c0: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
70d0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
70e0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
70f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7100: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
7110: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
7120: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
7130: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
7140: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
7150: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
7160: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
7170: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
7180: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
7190: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
71a0: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
71b0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
71c0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
71d0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
71e0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
71f0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
7200: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
7210: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
7220: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
7230: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
7240: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
7250: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
7260: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
7270: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
7280: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
7290: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
72a0: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
72b0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
72c0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
72d0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
72e0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
72f0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
7300: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
7310: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
7320: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
7330: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
7340: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
7350: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
7360: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
7370: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
7380: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
7390: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
73a0: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
73b0: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
73c0: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
73d0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
73e0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
73f0: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
7400: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
7410: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
7420: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
7430: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
7440: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
7450: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
7460: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
7470: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
7480: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
7490: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
74a0: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
74b0: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
74c0: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
74d0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
74e0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
74f0: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
7500: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
7510: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
7520: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
7530: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
7540: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
7550: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
7560: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
7570: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
7580: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
7590: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
75a0: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
75b0: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
75c0: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
75d0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
75e0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
75f0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
7600: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7610: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
7620: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
7630: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
7640: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
7650: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
7660: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
7670: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
7680: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
7690: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
76a0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
76b0: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
76c0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
76d0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
76e0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
76f0: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
7700: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
7710: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
7720: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
7730: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7740: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
7750: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
7760: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
7770: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
7780: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
7790: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
77a0: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
77b0: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
77c0: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
77d0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
77e0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
77f0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
7800: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
7810: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
7820: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
7830: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
7840: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
7850: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
7860: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
7870: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
7880: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
7890: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
78a0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
78b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
78c0: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
78d0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
78e0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
78f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
7900: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
7910: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
7920: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
7930: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
7940: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
7950: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
7960: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
7970: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
7980: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
7990: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
79a0: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
79b0: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
79c0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
79d0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
79e0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
79f0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
7a00: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
7a10: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
7a20: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
7a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
7a40: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
7a50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7a60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7a70: 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  p->iPage>0 );.  
7a80: 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
7a90: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
7aa0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
7ab0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
7ac0: 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  ext;.  }while( p
7ad0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
7ae0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7af0: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
7b00: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
7b10: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
7b20: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
7b30: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
7b40: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
7b50: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
7b60: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
7b70: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
7b80: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
7b90: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
7ba0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
7bb0: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
7bc0: 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
7bd0: 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c   of BtreeMoveto,
7be0: 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65   pKey is a packe
7bf0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a  d index record.*
7c00: 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e  * such as is gen
7c10: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  erated by the OP
7c20: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
7c30: 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a  de.  Unpack the.
7c40: 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68  ** record and th
7c50: 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76  en call BtreeMov
7c60: 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
7c70: 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f   do the work..*/
7c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7c90: 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
7ca0: 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
7cb0: 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
7cc0: 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   the btree to be
7cd0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
7ce0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
7cf0: 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79     /* Packed key
7d00: 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73   if the btree is
7d10: 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   an index */.  i
7d20: 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
7d30: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65     /* Integer ke
7d40: 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53  y for tables.  S
7d50: 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20  ize of pKey for 
7d60: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
7d70: 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20   bias,          
7d80: 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20   /* Bias search 
7d90: 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
7da0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
7db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
7dc0: 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
7dd0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
7de0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
7e00: 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70  us code */.  Unp
7e10: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
7e20: 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
7e30: 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
7e40: 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
7e50: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
7e60: 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
7e70: 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
7e80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c  = sqlite3VdbeAll
7e90: 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
7ea0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 29  (pCur->pKeyInfo)
7eb0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
7ec0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
7ed0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
7ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7ef0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
7f00: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
7f10: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
7f20: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
7f30: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
7f40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
7f50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7f60: 50 47 4e 4f 28 70 43 75 72 2d 3e 61 70 50 61 67  PGNO(pCur->apPag
7f70: 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
7f80: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74  pgno);.      got
7f90: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
7fa0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
7fb0: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
7fc0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
7fd0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
7fe0: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
7ff0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
8000: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
8010: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
8020: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
8030: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
8040: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
8050: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
8060: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8070: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
8080: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
8090: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
80a0: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
80b0: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
80c0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
80d0: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
80e0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
80f0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
8100: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
8110: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
8120: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
8130: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
8140: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
8150: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
8160: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
8170: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
8180: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
8190: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
81a0: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
81b0: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
81c0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
81d0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
81e0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
81f0: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
8200: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
8210: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
8220: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
8230: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
8240: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
8250: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
8260: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
8270: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
8280: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
8290: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
82a0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
82b0: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
82c0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
82d0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
82e0: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
82f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8300: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
8310: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
8320: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
8330: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
8340: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
8350: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
8360: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
8370: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
8380: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
8390: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
83a0: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
83b0: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
83c0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
83d0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
83e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
83f0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
8400: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8410: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
8420: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
8430: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
8440: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
8450: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
8460: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
8470: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
8480: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
8490: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
84a0: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
84b0: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
84c0: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
84d0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
84e0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
84f0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
8500: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
8510: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
8520: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
8530: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
8540: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
8550: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
8560: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
8570: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
8580: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
8590: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
85a0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
85b0: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
85c0: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
85d0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
85e0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
85f0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
8600: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
8610: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
8620: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
8630: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
8640: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
8650: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
8660: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
8670: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
8680: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
8690: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
86a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
86b0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
86c0: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
86d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
86e0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
86f0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
8700: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
8710: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
8720: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
8730: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
8740: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
8750: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
8760: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
8770: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
8780: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
8790: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
87a0: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
87b0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
87c0: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
87d0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
87e0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
87f0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
8800: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
8810: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
8820: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
8830: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
8840: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
8850: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
8860: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
8870: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
8880: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
8890: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
88a0: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
88b0: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
88c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
88d0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
88e0: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
88f0: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
8900: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
8910: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
8920: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
8930: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
8940: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
8950: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
8960: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
8970: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
8980: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
8990: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
89a0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
89b0: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
89c0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
89d0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
89e0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
89f0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
8a00: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
8a10: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
8a20: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
8a30: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
8a40: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
8a50: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
8a60: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
8a70: 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  kipNext==0 );.  
8a80: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
8a90: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
8aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8ab0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8ac0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
8ad0: 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  TS./*.** Provide
8ae0: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
8af0: 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69  rsor.  The parti
8b00: 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e  cular hint given
8b10: 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a   (and the type.*
8b20: 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  * and number of 
8b30: 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72 61  the varargs para
8b40: 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65 72  meters) is deter
8b50: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48 69  mined by the eHi
8b60: 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65  ntType.** parame
8b70: 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64 65  ter.  See the de
8b80: 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  finitions of the
8b90: 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61   BTREE_HINT_* ma
8ba0: 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73  cros for details
8bb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8bc0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
8bd0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
8be0: 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20   int eHintType, 
8bf0: 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20  ...){.  /* Used 
8c00: 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74  only by system t
8c10: 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20 74  hat substitute t
8c20: 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65  heir own storage
8c30: 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e   engine */.}.#en
8c40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  dif../*.** Provi
8c50: 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f  de flag hints to
8c60: 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
8c70: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
8c80: 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73  eCursorHintFlags
8c90: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
8ca0: 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20   unsigned x){.  
8cb0: 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45  assert( x==BTREE
8cc0: 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42  _SEEK_EQ || x==B
8cd0: 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c  TREE_BULKLOAD ||
8ce0: 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d   x==0 );.  pCur-
8cf0: 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a  >hints = x;.}...
8d00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8d10: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
8d20: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
8d30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
8d40: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
8d50: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
8d60: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
8d70: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
8d80: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
8d90: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
8da0: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
8db0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
8dc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f  .** Return 0 (no
8dd0: 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20  t a valid page) 
8de0: 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63  for pgno==1 sinc
8df0: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  e there is.** no
8e00: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73   pointer map ass
8e10: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
8e20: 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72  e 1.  The integr
8e30: 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a  ity_check logic.
8e40: 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ** requires that
8e50: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c   ptrmapPageno(*,
8e60: 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  1)!=1..*/.static
8e70: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
8e80: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
8e90: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
8ea0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
8eb0: 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Page;.  Pgno iPt
8ec0: 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73  rMap, ret;.  ass
8ed0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8ee0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
8ef0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
8f00: 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  o<2 ) return 0;.
8f10: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
8f20: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
8f30: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
8f40: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
8f50: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
8f60: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
8f70: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
8f80: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
8f90: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
8fa0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
8fb0: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
8fc0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
8fd0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
8fe0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
8ff0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
9000: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
9010: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
9020: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
9030: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
9040: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
9050: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
9060: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
9070: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
9080: 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  no'..**.** If *p
9090: 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  RC is initially 
90a0: 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51  non-zero (non-SQ
90b0: 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68  LITE_OK) then th
90c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
90d0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e   a no-op.  If an
90e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
90f0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
9100: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69  rror code is wri
9110: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52  tten.** into *pR
9120: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  C..*/.static voi
9130: 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  d ptrmapPut(BtSh
9140: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
9150: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
9160: 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20  gno parent, int 
9170: 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20  *pRC){.  DbPage 
9180: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
9190: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
91a0: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
91b0: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
91c0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
91d0: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
91e0: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
91f0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
9200: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
9210: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
9220: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
9230: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
9240: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
9250: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
9260: 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
9270: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
9280: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
9290: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
92a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
92b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
92c0: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
92d0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
92e0: 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f  s never added to
92f0: 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
9300: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
9310: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
9320: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
9330: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
9340: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
9350: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
9360: 54 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 4d 61  T.  if( pBt->pMa
9370: 70 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  p ){.    *pRC = 
9380: 62 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65  btreePtrmapStore
9390: 28 70 42 74 2c 20 6b 65 79 2c 20 65 54 79 70 65  (pBt, key, eType
93a0: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 72  , parent);.    r
93b0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
93c0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  f..  assert( pBt
93d0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
93e0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
93f0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
9400: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9410: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9420: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
9430: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
9440: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
9450: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
9460: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
9470: 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a  , &pDbPage, 0);.
9480: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9490: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
94a0: 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
94b0: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
94c0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
94d0: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
94e0: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
94f0: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
9500: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9510: 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d  T;.    goto ptrm
9520: 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61  ap_exit;.  }.  a
9530: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
9540: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
9550: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74  eSize-5 );.  pPt
9560: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
9570: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
9580: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
9590: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
95a0: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
95b0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
95c0: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
95d0: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
95e0: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
95f0: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
9600: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
9610: 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72  t));.    *pRC= r
9620: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
9630: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
9640: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9650: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
9660: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
9670: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
9680: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
9690: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
96a0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70  t);.    }.  }..p
96b0: 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71  trmap_exit:.  sq
96c0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
96d0: 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pDbPage);.}../*.
96e0: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
96f0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
9700: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
9710: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
9720: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
9730: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
9740: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
9750: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
9760: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
9770: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
9780: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
9790: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
97a0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
97b0: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
97c0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
97d0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
97e0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
97f0: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
9800: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
9810: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
9820: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
9830: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
9840: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
9850: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
9860: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
9870: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
9880: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
9890: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
98a0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
98b0: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
98c0: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
98d0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
98e0: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
98f0: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
9900: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
9910: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9920: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
9930: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
9940: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
9950: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
9960: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
9970: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
9980: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20  rmap, &pDbPage, 
9990: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  0);.  if( rc!=0 
99a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
99b0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
99c0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
99d0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
99e0: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
99f0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
9a00: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
9a10: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
9a20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
9a30: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
9a40: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
9a50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9a60: 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
9a70: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
9a80: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
9a90: 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -5 );.  assert( 
9aa0: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
9ab0: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
9ac0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
9ad0: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
9ae0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
9af0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
9b00: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
9b10: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
9b20: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
9b30: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
9b40: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9b50: 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29  PT_PGNO(iPtrmap)
9b60: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9b70: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  E_OK;.}..#else /
9b80: 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c  * if defined SQL
9b90: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
9ba0: 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  UUM */.  #define
9bb0: 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79   ptrmapPut(w,x,y
9bc0: 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65  ,z,rc).  #define
9bd0: 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79   ptrmapGet(w,x,y
9be0: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
9bf0: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
9c00: 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72  tOvflPtr(x, y, r
9c10: 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
9c20: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
9c30: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
9c40: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
9c50: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
9c60: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
9c70: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
9c80: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
9c90: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
9ca0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
9cb0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
9cc0: 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ** findCellPastP
9cd0: 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73 61  tr() does the sa
9ce0: 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b 69  me except it ski
9cf0: 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69 74  ps past the init
9d00: 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68  ial.** 4-byte ch
9d10: 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e  ild pointer foun
9d20: 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  d on interior pa
9d30: 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69 73  ges, if there is
9d40: 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   one..**.** This
9d50: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
9d60: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
9d70: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
9d80: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
9d90: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
9da0: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
9db0: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
9dc0: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
9dd0: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
9de0: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
9df0: 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66  I)]))).#define f
9e00: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50  indCellPastPtr(P
9e10: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
9e20: 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e  ataOfst + ((P)->
9e30: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
9e40: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
9e50: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
9e60: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
9e70: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20   is common tail 
9e80: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62  processing for b
9e90: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9ea0: 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50  () and.** btreeP
9eb0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
9ec0: 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  () for the case 
9ed0: 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f  when the cell do
9ee0: 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72  es not fit entir
9ef0: 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67  ely.** on a sing
9f00: 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20  le B-tree page. 
9f10: 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20   Make necessary 
9f20: 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74  adjustments to t
9f30: 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73  he CellInfo.** s
9f40: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
9f50: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
9f60: 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50 61  INE void btreePa
9f70: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9f80: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20  eForOverflow(.  
9f90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9fa0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9fb0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9fc0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9fd0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9fe0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9ff0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a000: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a010: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a020: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a030: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ture */.){.  /* 
a040: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
a050: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
a060: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
a070: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
a080: 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65  e.  ** to decide
a090: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
a0a0: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
a0b0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
a0c0: 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66   onto.  ** overf
a0d0: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
a0e0: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
a0f0: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
a100: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a  nt of unused.  *
a110: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
a120: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
a130: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
a140: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
a150: 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77  age.  ** in betw
a160: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
a170: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a   maxLocal..  **.
a180: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
a190: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
a1a0: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
a1b0: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
a1c0: 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20  in any.  ** way 
a1d0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
a1e0: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
a1f0: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f  ile format..  */
a200: 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b  .  int minLocal;
a210: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
a220: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
a230: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
a240: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
a250: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
a260: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
a270: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
a280: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
a290: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
a2a0: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
a2b0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
a2c0: 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ..  minLocal = p
a2d0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a2e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
a2f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
a300: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
a310: 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  al + (pInfo->nPa
a320: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
a330: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
a340: 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20  sableSize-4);.  
a350: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
a360: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
a370: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
a380: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
a390: 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73 20  ;.  if( surplus 
a3a0: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
a3b0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
a3c0: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
a3d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
a3e0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
a3f0: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  16)minLocal;.  }
a400: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
a410: 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e  = (u16)(&pInfo->
a420: 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e  pPayload[pInfo->
a430: 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29  nLocal] - pCell)
a440: 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 4;.}../*.** T
a450: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
a460: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
a470: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
a480: 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43   MemPage.xParseC
a490: 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e  ell().** method.
a4a0: 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  .**.** Parse a c
a4b0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
a4c0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
a4d0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
a4e0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65  ture..**.** btre
a4f0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
a500: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c         =>   tabl
a510: 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64  e btree leaf nod
a520: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
a530: 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20  CellNoPayload() 
a540: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
a550: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
a560: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
a570: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d  llPtrIndex()   =
a580: 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20  >   index btree 
a590: 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nodes.**.** Ther
a5a0: 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70  e is also a wrap
a5b0: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72  per function btr
a5c0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68  eeParseCell() th
a5d0: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
a5e0: 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65  all MemPage type
a5f0: 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72  s and that refer
a600: 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62  ences the cell b
a610: 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  y index rather t
a620: 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65  han.** by pointe
a630: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
a640: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
a650: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20  PtrNoPayload(.  
a660: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a670: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a680: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a690: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a6a0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a6b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a6c0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a6d0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a6e0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a6f0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a700: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
a710: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a720: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a730: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a740: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
a750: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eaf==0 );.  asse
a760: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
a770: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69  PtrSize==4 );.#i
a780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
a790: 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  UG.  UNUSED_PARA
a7a0: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a7b0: 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  ndif.  pInfo->nS
a7c0: 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72  ize = 4 + getVar
a7d0: 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28  int(&pCell[4], (
a7e0: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
a7f0: 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  y);.  pInfo->nPa
a800: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e  yload = 0;.  pIn
a810: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a  fo->nLocal = 0;.
a820: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
a830: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
a840: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
a850: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
a860: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
a870: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
a880: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
a890: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
a8a0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
a8b0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
a8c0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
a8d0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a8e0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
a8f0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
a900: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
a910: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
a920: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
a930: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
a940: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
a950: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
a960: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a970: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
a980: 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20  ayload */.  u64 
a990: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
a9a0: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64      /* Extracted
a9b0: 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20   Key value */.. 
a9c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a9d0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a9e0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a9f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
aa00: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
aa10: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
aa20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
aa30: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20  >intKeyLeaf );. 
aa40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
aa50: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
aa60: 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65  );.  pIter = pCe
aa70: 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ll;..  /* The ne
aa80: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
aa90: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
aaa0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
aab0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
aac0: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61  int32(pIter, nPa
aad0: 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a  yload);.  **.  *
aae0: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
aaf0: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
ab00: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
ab10: 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20    */.  nPayload 
ab20: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
ab30: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
ab40: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
ab50: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
ab60: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
ab70: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
ab80: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
ab90: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
aba0: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
abb0: 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65    }while( (*pIte
abc0: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
abd0: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
abe0: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54  pIter++;..  /* T
abf0: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
ac00: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
ac10: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
ac20: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
ac30: 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20  etVarint(pIter, 
ac40: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
ac50: 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ey);.  **.  ** T
ac60: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
ac70: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
ac80: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
ac90: 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65  /.  iKey = *pIte
aca0: 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30  r;.  if( iKey>=0
acb0: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
acc0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b  End = &pIter[7];
acd0: 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37  .    iKey &= 0x7
ace0: 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b  f;.    while(1){
acf0: 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69  .      iKey = (i
ad00: 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  Key<<7) | (*++pI
ad10: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
ad20: 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c     if( (*pIter)<
ad30: 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  0x80 ) break;.  
ad40: 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70      if( pIter>=p
ad50: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69  End ){.        i
ad60: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20  Key = (iKey<<8) 
ad70: 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20  | *++pIter;.    
ad80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ad90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
ada0: 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f  Iter++;..  pInfo
adb0: 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29  ->nKey = *(i64*)
adc0: 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e  &iKey;.  pInfo->
add0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
ade0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
adf0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
ae00: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
ae10: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
ae20: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
ae30: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
ae40: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
ae50: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
ae60: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
ae70: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
ae80: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
ae90: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
aea0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
aeb0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
aec0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
aed0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
aee0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
aef0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
af00: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
af10: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
af20: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
af30: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
af40: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
af50: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
af60: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
af70: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
af80: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
af90: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
afa0: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
afb0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
afc0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
afd0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
afe0: 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61  trIndex(.  MemPa
aff0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
b000: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
b010: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
b020: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
b030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b040: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
b050: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
b060: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
b070: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
b080: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
b090: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  */.){.  u8 *pIte
b0a0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
b0b0: 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20  /* For scanning 
b0c0: 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f  through pCell */
b0d0: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
b0e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b0f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
b100: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
b110: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
b120: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b130: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b140: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b150: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
b160: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
b170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b180: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d  ge->intKeyLeaf==
b190: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
b1a0: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
b1b0: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50  ildPtrSize;.  nP
b1c0: 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b  ayload = *pIter;
b1d0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e  .  if( nPayload>
b1e0: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
b1f0: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38  *pEnd = &pIter[8
b200: 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  ];.    nPayload 
b210: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
b220: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
b230: 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20  = (nPayload<<7) 
b240: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
b250: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
b260: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
b270: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b280: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
b290: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
b2a0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
b2b0: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
b2c0: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
b2d0: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
b2e0: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
b2f0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
b300: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
b310: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
b320: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
b330: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
b340: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
b350: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
b360: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
b370: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
b380: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
b390: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
b3a0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
b3b0: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
b3c0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
b3d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
b3e0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
b3f0: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
b400: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
b410: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
b420: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
b430: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
b440: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
b450: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c  )nPayload;.  }el
b460: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
b470: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
b480: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
b490: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
b4a0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
b4b0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
b4c0: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
b4d0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
b4e0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
b4f0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
b500: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
b510: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
b520: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
b530: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
b540: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
b550: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
b560: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
b570: 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d  e */.){.  pPage-
b580: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b590: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
b5a0: 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f  e, iCell), pInfo
b5b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
b5c0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
b5d0: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
b5e0: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
b5f0: 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a  mPage.xCellSize.
b600: 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  ** method..**.**
b610: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
b620: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
b630: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
b640: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
b650: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
b660: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
b670: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
b680: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
b690: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
b6a0: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
b6b0: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
b6c0: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
b6d0: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
b6e0: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
b6f0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
b700: 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  **.** cellSizePt
b710: 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20  rNoPayload()    
b720: 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72  =>   table inter
b730: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c  nal nodes.** cel
b740: 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20  lSizePtr()      
b750: 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20         =>   all 
b760: 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61  index nodes & ta
b770: 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ble leaf nodes.*
b780: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
b790: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
b7a0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
b7b0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
b7c0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
b7d0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20  ->childPtrSize; 
b7e0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b7f0: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b800: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
b840: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75   a varint */.  u
b850: 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  32 nSize;       
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b880: 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
b890: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
b8a0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
b8b0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
b8c0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
b8d0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
b8e0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
b8f0: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
b900: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
b910: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
b920: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
b930: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
b940: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
b950: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
b960: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
b970: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
b980: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
b990: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
b9a0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
b9b0: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
b9c0: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
b9d0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b9e0: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b9f0: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
ba00: 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20  ndif..  nSize = 
ba10: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
ba20: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
ba30: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38   pEnd = &pIter[8
ba40: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
ba50: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
ba60: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
ba70: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
ba80: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
ba90: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
baa0: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
bab0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
bac0: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
bad0: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
bae0: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
baf0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
bb00: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
bb10: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
bb20: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
bb30: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
bb40: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
bb50: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
bb60: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
bb70: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
bb80: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bb90: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
bba0: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
bbb0: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
bbc0: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
bbd0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
bbe0: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
bbf0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
bc00: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
bc10: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
bc20: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
bc30: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
bc40: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
bc50: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
bc60: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
bc70: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
bc80: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
bc90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
bca0: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
bcb0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
bcc0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
bcd0: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
bce0: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
bcf0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
bd00: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
bd10: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
bd20: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
bd30: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
bd40: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
bd50: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
bd60: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
bd70: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
bd80: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
bd90: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
bda0: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
bdb0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
bdc0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
bdd0: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
bde0: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
bdf0: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
be00: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74  (u16)nSize;.}.st
be10: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
be20: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65  ePtrNoPayload(Me
be30: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
be40: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
be50: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
be60: 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  4; /* For loopin
be70: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
be80: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
be90: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
bea0: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
beb0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23  r a varint */..#
bec0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
bed0: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
bee0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
bef0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
bf00: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
bf10: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
bf20: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
bf30: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
bf40: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
bf50: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
bf60: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
bf70: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
bf80: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
bf90: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
bfa0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
bfb0: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
bfc0: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
bfd0: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
bfe0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
bff0: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
c000: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
c010: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
c020: 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  uginfo);.#else. 
c030: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
c040: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
c050: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
c060: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
c070: 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70  =4 );.  pEnd = p
c080: 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c  Iter + 9;.  whil
c090: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
c0a0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
c0b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
c0c0: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28  buginfo.nSize==(
c0d0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
c0e0: 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
c0f0: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
c100: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
c110: 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  l);.}...#ifdef S
c120: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
c130: 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e  his variation on
c140: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69   cellSizePtr() i
c150: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
c160: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
c170: 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f  ents.** only. */
c180: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
c190: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
c1a0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
c1b0: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d  .  return pPage-
c1c0: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
c1d0: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
c1e0: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
c1f0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
c200: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
c210: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
c220: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
c230: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
c240: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
c250: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
c260: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
c270: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
c280: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
c290: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
c2a0: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
c2b0: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
c2c0: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
c2d0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
c2e0: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
c2f0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
c300: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
c310: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
c320: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
c330: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
c340: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
c350: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
c360: 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
c370: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e  yload ){.    Pgn
c380: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
c390: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53  e(&pCell[info.nS
c3a0: 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72  ize-4]);.    ptr
c3b0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
c3c0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
c3d0: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
c3e0: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
c3f0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
c400: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
c410: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68  e page given. Th
c420: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67  is routine reorg
c430: 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74  anizes cells wit
c440: 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hin the.** page 
c450: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
c460: 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73  e no free-blocks
c470: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f   on the free-blo
c480: 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50  ck list..**.** P
c490: 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61  arameter nMaxFra
c4a0: 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  g is the maximum
c4b0: 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d   amount of fragm
c4c0: 65 6e 74 65 64 20 73 70 61 63 65 20 74 68 61 74  ented space that
c4d0: 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65   may be.** prese
c4e0: 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 61  nt in the page a
c4f0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
c500: 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  e returns..**.**
c510: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c520: 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69  44582-60138 SQLi
c530: 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65  te may from time
c540: 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e   to time reorgan
c550: 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20  ize a.** b-tree 
c560: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
c570: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c  re are no freebl
c580: 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74  ocks or fragment
c590: 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75   bytes, all.** u
c5a0: 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20  nused bytes are 
c5b0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
c5c0: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61   unallocated spa
c5d0: 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61  ce region, and a
c5e0: 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20  ll.** cells are 
c5f0: 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61  packed tightly a
c600: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c610: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
c620: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
c630: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c640: 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67  ge, int nMaxFrag
c650: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
c680: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
c6b0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  e i-th cell */. 
c6c0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c6e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
c6f0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
c700: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
c710: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c720: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
c730: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
c740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c750: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
c760: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
c770: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
c780: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
c790: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
c7a0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
c7b0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
c7c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c7d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
c7e0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
c7f0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
c800: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
c810: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c820: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
c830: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
c840: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
c850: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
c860: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
c870: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
c880: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
c890: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
c8a0: 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ent */.  unsigne
c8b0: 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20  d char *src;    
c8c0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66      /* Source of
c8d0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
c8e0: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
c8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
c900: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
c910: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
c920: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
c930: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
c940: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
c950: 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ex */..  assert(
c960: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c970: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c980: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
c990: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
c9a0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c9b0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
c9c0: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
c9d0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
c9e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c9f0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
ca00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ca10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ca20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
ca30: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
ca40: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
ca50: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
ca60: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
ca70: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
ca80: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
ca90: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
caa0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
cab0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
cac0: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
cad0: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
cae0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
caf0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
cb00: 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  ll;.  usableSize
cb10: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
cb20: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  sableSize;..  /*
cb30: 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
cb40: 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20 74  les pages with t
cb50: 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65 65  wo or fewer free
cb60: 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78   blocks and nMax
cb70: 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77  Frag.  ** or few
cb80: 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  er fragmented by
cb90: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
cba0: 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20 74  e it is faster t
cbb0: 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20  o move the.  ** 
cbc0: 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f  two (or one) blo
cbd0: 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69  cks of cells usi
cbe0: 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64  ng memmove() and
cbf0: 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72 65   add the require
cc00: 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74  d.  ** offsets t
cc10: 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69  o each pointer i
cc20: 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
cc30: 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69 74  er array than it
cc40: 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63   is to .  ** rec
cc50: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74  onstruct the ent
cc60: 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ire page.  */.  
cc70: 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64  if( (int)data[hd
cc80: 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29  r+7]<=nMaxFrag )
cc90: 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65 20  {.    int iFree 
cca0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ccb0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66  [hdr+1]);.    if
ccc0: 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( iFree ){.     
ccd0: 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20 67 65   int iFree2 = ge
cce0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
ccf0: 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ee]);..      /* 
cd00: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 68  pageFindSlot() h
cd10: 61 73 20 61 6c 72 65 61 64 79 20 76 65 72 69 66  as already verif
cd20: 69 65 64 20 74 68 61 74 20 66 72 65 65 20 62 6c  ied that free bl
cd30: 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65 64 0a  ocks are sorted.
cd40: 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
cd50: 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69 74 68  r of offset with
cd60: 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61 6e 64  in the page, and
cd70: 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65   that no block e
cd80: 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20  xtends.      ** 
cd90: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
cda0: 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76 69 64  the page. Provid
cdb0: 65 64 20 74 68 65 20 74 77 6f 20 66 72 65 65 20  ed the two free 
cdc0: 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20  slots do not .  
cdd0: 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20      ** overlap, 
cde0: 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  this guarantees 
cdf0: 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65  that the memmove
ce00: 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77  () calls below w
ce10: 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  ill not.      **
ce20: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 75   overwrite the u
ce30: 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65 20 62  sableSize byte b
ce40: 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66 20 74  uffer, even if t
ce50: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
ce60: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 72  .      ** is cor
ce70: 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rupt.  */.      
ce80: 61 73 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d  assert( iFree2==
ce90: 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46 72 65  0 || iFree2>iFre
cea0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
ceb0: 74 28 20 69 46 72 65 65 2b 67 65 74 32 62 79 74  t( iFree+get2byt
cec0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d  e(&data[iFree+2]
ced0: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
cee0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cef0: 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46   iFree2==0 || iF
cf00: 72 65 65 32 2b 67 65 74 32 62 79 74 65 28 26 64  ree2+get2byte(&d
cf10: 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c  ata[iFree2+2]) <
cf20: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
cf30: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46  .      if( 0==iF
cf40: 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46  ree2 || (data[iF
cf50: 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61  ree2]==0 && data
cf60: 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29  [iFree2+1]==0) )
cf70: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45  {.        u8 *pE
cf80: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
cf90: 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
cfa0: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41  ;.        u8 *pA
cfb0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ddr;.        int
cfc0: 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   sz2 = 0;.      
cfd0: 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62    int sz = get2b
cfe0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
cff0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  2]);.        int
d000: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
d010: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
d020: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
d030: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  2 ){.          i
d040: 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72 65  f( iFree+sz>iFre
d050: 65 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e2 ) return SQLI
d060: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
d070: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
d080: 20 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65          sz2 = ge
d090: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
d0a0: 65 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ee2+2]);.       
d0b0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
d0c0: 2b 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32 2d 28  +sz+sz2+iFree2-(
d0d0: 69 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75 73 61  iFree+sz) <= usa
d0e0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
d0f0: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61       memmove(&da
d100: 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d  ta[iFree+sz+sz2]
d110: 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  , &data[iFree+sz
d120: 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65  ], iFree2-(iFree
d130: 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  +sz));.         
d140: 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20   sz += sz2;.    
d150: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62      }.        cb
d160: 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20  rk = top+sz;.   
d170: 20 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72       assert( cbr
d180: 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d  k+(iFree-top) <=
d190: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
d1a0: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
d1b0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74  data[cbrk], &dat
d1c0: 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f  a[top], iFree-to
d1d0: 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  p);.        for(
d1e0: 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c  pAddr=&data[cell
d1f0: 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70  Offset]; pAddr<p
d200: 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a  End; pAddr+=2){.
d210: 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67            pc = g
d220: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
d230: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63            if( pc
d240: 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79  <iFree ){ put2by
d250: 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29  te(pAddr, pc+sz)
d260: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c  ; }.          el
d270: 73 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32  se if( pc<iFree2
d280: 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64   ){ put2byte(pAd
d290: 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20  dr, pc+sz2); }. 
d2a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d2b0: 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74   goto defragment
d2c0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
d2d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20    }.  }..  cbrk 
d2e0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
d2f0: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
d300: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f  leSize - 4;.  fo
d310: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
d320: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
d330: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
d340: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
d350: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
d360: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
d370: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
d380: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
d390: 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
d3a0: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
d3b0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
d3c0: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
d3d0: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20  );.    /* These 
d3e0: 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20  conditions have 
d3f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72  already been ver
d400: 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e  ified in btreeIn
d410: 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20  itPage().    ** 
d420: 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73  if PRAGMA cell_s
d430: 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20  ize_check=ON..  
d440: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
d450: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
d460: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
d470: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d480: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
d490: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
d4a0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
d4b0: 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26  c>=iCellFirst &&
d4c0: 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc<=iCellLast )
d4d0: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61  ;.    size = pPa
d4e0: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
d4f0: 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a  age, &src[pc]);.
d500: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
d510: 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ;.    if( cbrk<i
d520: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
d530: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
d540: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d550: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
d560: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
d570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
d580: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
d590: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
d5a0: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
d5b0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
d5c0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
d5d0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
d5e0: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
d5f0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
d600: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
d610: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
d620: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
d630: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
d640: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
d650: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
d660: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
d670: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
d680: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
d690: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
d6a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
d6b0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
d6c0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
d6d0: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
d6e0: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
d6f0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
d700: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
d710: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
d720: 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  ze);.  }.  data[
d730: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65  hdr+7] = 0;.. de
d740: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20  fragment_out:.  
d750: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
d760: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
d770: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
d780: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d790: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
d7a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
d7b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
d7c0: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
d7d0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
d7e0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
d7f0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
d800: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
d810: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
d820: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
d830: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
d840: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
d850: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
d860: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
d870: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
d880: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d890: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
d8a0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
d8b0: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
d8c0: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
d8d0: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
d8e0: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
d8f0: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
d900: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
d910: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
d920: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
d930: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
d940: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
d950: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
d960: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
d970: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
d980: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
d990: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
d9a0: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
d9b0: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
d9c0: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
d9d0: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
d9e0: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
d9f0: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
da00: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
da10: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
da20: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
da30: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
da40: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
da50: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
da60: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
da70: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
da80: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
da90: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
daa0: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
dab0: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
dac0: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
dad0: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
dae0: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
daf0: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
db00: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
db10: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
db20: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
db30: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
db40: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
db50: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
db60: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
db70: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
db80: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
db90: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
dba0: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
dbb0: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
dbc0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
dbd0: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
dbe0: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69    do{.    int si
dbf0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
dc00: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72  * Size of the fr
dc10: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f  ee slot */.    /
dc20: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
dc30: 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72 65  -06866-39125 Fre
dc40: 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61  eblocks are alwa
dc50: 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20  ys connected in 
dc60: 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  order of.    ** 
dc70: 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65  increasing offse
dc80: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63  t. */.    if( pc
dc90: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
dca0: 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20   pc<iAddr+4 ){. 
dcb0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
dcc0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
dcd0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
dce0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
dcf0: 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
dd00: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
dd10: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
dd20: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
dd30: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
dd40: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
dd50: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
dd60: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
dd70: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
dd80: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
dd90: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
dda0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
ddb0: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
ddc0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
ddd0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
dde0: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
ddf0: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
de00: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
de10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
de20: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
de30: 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65  if( pc < pPg->ce
de40: 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e  llOffset+2*pPg->
de50: 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63  nCell || size+pc
de60: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
de70: 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20  .        *pRc = 
de80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
de90: 47 4e 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  GNO(pPg->pgno);.
dea0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
deb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
dec0: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
ded0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
dee0: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
def0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
df00: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
df10: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
df20: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
df30: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
df40: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
df50: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
df60: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
df70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
df80: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
df90: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
dfa0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
dfb0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
dfc0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
dfd0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
dfe0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
dff0: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
e000: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
e010: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
e020: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
e030: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
e040: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e050: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
e060: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
e070: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
e080: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
e090: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
e0a0: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
e0b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
e0c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
e0d0: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
e0e0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
e0f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e100: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
e110: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
e120: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
e130: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
e140: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d  &aData[pc]);.  }
e150: 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20  while( pc );..  
e160: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
e170: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
e180: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
e190: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
e1a0: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
e1b0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
e1c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
e1d0: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
e1e0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
e1f0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
e200: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
e210: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
e220: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
e230: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
e240: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
e250: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
e260: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
e270: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
e280: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
e290: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
e2a0: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
e2b0: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
e2c0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
e2d0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
e2e0: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
e2f0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
e300: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
e310: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
e320: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
e330: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
e340: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
e350: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
e360: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
e370: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
e380: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
e390: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
e3a0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
e3b0: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
e3c0: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
e3d0: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
e3e0: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
e3f0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
e400: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
e410: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
e420: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
e430: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
e440: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
e450: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
e460: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
e470: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
e480: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
e490: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
e4a0: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
e4b0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
e4c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
e4d0: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
e500: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
e510: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
e520: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e530: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
e540: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
e550: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
e560: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
e570: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
e580: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
e590: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
e5a0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
e5b0: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
e5c0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
e5d0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
e5e0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
e5f0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
e600: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e610: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
e620: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
e630: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
e640: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
e650: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
e660: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
e670: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
e680: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
e690: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
e6a0: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
e6b0: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
e6c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
e6d0: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
e6e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
e6f0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
e700: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
e710: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
e720: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
e730: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
e740: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
e750: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
e760: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e770: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
e780: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
e790: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
e7a0: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
e7b0: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
e7c0: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
e7d0: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
e7e0: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
e7f0: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
e800: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
e810: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
e820: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
e830: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
e840: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
e850: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
e860: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
e870: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
e880: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
e890: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
e8a0: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
e8b0: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
e8c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e8d0: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
e8e0: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
e8f0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
e900: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
e910: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
e920: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
e930: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
e940: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
e950: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
e960: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
e970: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
e980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e990: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e9a0: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
e9b0: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
e9c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
e9d0: 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61  re is enough spa
e9e0: 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61  ce between gap a
e9f0: 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d  nd top for one m
ea00: 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ore cell pointer
ea10: 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72  .  ** array entr
ea20: 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66  y offset, and if
ea30: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
ea40: 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e   not empty, then
ea50: 20 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a   search the.  **
ea60: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
ea70: 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f  g for a free slo
ea80: 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  t big enough to 
ea90: 73 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75  satisfy the requ
eaa0: 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  est..  */.  test
eab0: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
eac0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
ead0: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
eae0: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
eaf0: 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74  op );.  if( (dat
eb00: 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61  a[hdr+2] || data
eb10: 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b  [hdr+1]) && gap+
eb20: 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38  2<=top ){.    u8
eb30: 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46   *pSpace = pageF
eb40: 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e  indSlot(pPage, n
eb50: 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Byte, &rc);.    
eb60: 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20  if( pSpace ){.  
eb70: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61      assert( pSpa
eb80: 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70  ce>=data && (pSp
eb90: 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33  ace - data)<6553
eba0: 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78  6 );.      *pIdx
ebb0: 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20   = (int)(pSpace 
ebc0: 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72  - data);.      r
ebd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ebe0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
ebf0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
ec00: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
ec10: 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73  .  /* The reques
ec20: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66  t could not be f
ec30: 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61  ulfilled using a
ec40: 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20   freelist slot. 
ec50: 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73   Check.  ** to s
ec60: 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74  ee if defragment
ec70: 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
ec80: 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ry..  */.  testc
ec90: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
eca0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
ecb0: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
ecc0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
ecd0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
ece0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
ecf0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
ed00: 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e  tPage(pPage, MIN
ed10: 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  (4, pPage->nFree
ed20: 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a   - (2+nByte)));.
ed30: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
ed40: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
ed50: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
ed60: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
ed70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
ed80: 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  +2+nByte<=top );
ed90: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
eda0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
edb0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
edc0: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
edd0: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
ede0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
edf0: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
ee00: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
ee10: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
ee20: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
ee30: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
ee40: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
ee50: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
ee60: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
ee70: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
ee80: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
ee90: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
eea0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
eeb0: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
eec0: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
eed0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
eee0: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
eef0: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
ef00: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ef10: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
ef20: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
ef30: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
ef40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
ef50: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
ef60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ef70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
ef80: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
ef90: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
efa0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
efb0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
efc0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
efd0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
efe0: 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74  ge->aData[iStart
eff0: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
f000: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
f010: 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  s iSize bytes..*
f020: 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72  *.** Adjacent fr
f030: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61  eeblocks are coa
f040: 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  lesced..**.** No
f050: 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  te that even tho
f060: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
f070: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
f080: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
f090: 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72  age(),.** that r
f0a0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
f0b0: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62  detect overlap b
f0c0: 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20  etween cells or 
f0d0: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72  freeblocks.  Nor
f0e0: 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65  .** does it dete
f0f0: 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  ct cells or free
f100: 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72  blocks that encr
f110: 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65  ouch into the re
f120: 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20  served bytes.** 
f130: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
f140: 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61  e page.  So do a
f150: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70  dditional corrup
f160: 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69  tion checks insi
f170: 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  de this.** routi
f180: 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ne and return SQ
f190: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
f1a0: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65  any problems are
f1b0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
f1c0: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
f1d0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
f1e0: 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20  u16 iStart, u16 
f1f0: 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50  iSize){.  u16 iP
f200: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74  /* Address of pt
f230: 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c  r to next freebl
f240: 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72  ock */.  u16 iFr
f250: 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20  eeBlk;          
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f270: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
f280: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
f290: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f2c0: 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20  ge header size. 
f2d0: 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75   0 or 100 */.  u
f2e0: 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20  8 nFrag = 0;    
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f       /* Reductio
f310: 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69  n in fragmentati
f320: 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69  on */.  u16 iOri
f330: 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20  gSize = iSize;  
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f350: 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
f360: 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33  of iSize */.  u3
f370: 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d  2 iLast = pPage-
f380: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
f390: 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70  -4; /* Largest p
f3a0: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
f3b0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33  k offset */.  u3
f3c0: 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  2 iEnd = iStart 
f3d0: 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  + iSize;        
f3e0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
f3f0: 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72  e past the iStar
f400: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
f410: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
f420: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
f430: 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74  ;   /* Page cont
f440: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
f450: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
f460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
f470: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
f480: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
f490: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
f4a0: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
f4b0: 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
f4c0: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
f4d0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
f4e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
f4f0: 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
f500: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
f510: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
f520: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f530: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
f540: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
f550: 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
f560: 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
f570: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
f580: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
f590: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a  tart<=iLast );..
f5a0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
f5b0: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
f5c0: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
f5d0: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
f5e0: 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  lete.  ** option
f5f0: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
f600: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
f610: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
f620: 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20  FAST_SECURE ){. 
f630: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
f640: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
f650: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
f660: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
f670: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
f680: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
f690: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
f6a0: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
f6b0: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
f6c0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
f6d0: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
f6e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f6f0: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
f700: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
f710: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
f720: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
f730: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
f740: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
f750: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
f760: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
f770: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
f780: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
f790: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
f7a0: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69  (&data[iPtr]))<i
f7b0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
f7c0: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
f7d0: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  +4 ){.        if
f7e0: 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20  ( iFreeBlk==0 ) 
f7f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72  break;.        r
f800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f810: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
f820: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
f830: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
f840: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
f850: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
f860: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
f870: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
f880: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
f890: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
f8a0: 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65  Blk>iPtr || iFre
f8b0: 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  eBlk==0 );.  .  
f8c0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
f8d0: 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46  nt:.    **    iF
f8e0: 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20  reeBlk:   First 
f8f0: 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20  freeblock after 
f900: 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20  iStart, or zero 
f910: 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20  if none.    **  
f920: 20 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68    iPtr:       Th
f930: 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70  e address of a p
f940: 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42  ointer to iFreeB
f950: 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
f960: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
f970: 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
f980: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
f990: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
f9a0: 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
f9b0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
f9c0: 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
f9d0: 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
f9e0: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
f9f0: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
fa00: 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
fa10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fa20: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
fa30: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 45 6e  pgno);.      iEn
fa40: 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67  d = iFreeBlk + g
fa50: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
fa60: 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20  reeBlk+2]);.    
fa70: 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61    if( iEnd > pPa
fa80: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
fa90: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
faa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fab0: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
fac0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
fad0: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
fae0: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
faf0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
fb00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
fb10: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
fb20: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
fb30: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
fb40: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
fb50: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
fb60: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
fb70: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
fb80: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
fb90: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
fba0: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
fbb0: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
fbc0: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
fbd0: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
fbe0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
fbf0: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
fc00: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
fc10: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
fc20: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
fc30: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
fc40: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
fc50: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
fc60: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
fc70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
fc80: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
fc90: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
fca0: 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
fcb0: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
fcc0: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
fcd0: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
fce0: 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
fcf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
fd00: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
fd10: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
fd20: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
fd30: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
fd40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
fd50: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Frag;.  }.  if( 
fd60: 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65  iStart==get2byte
fd70: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
fd80: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
fd90: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
fda0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
fdb0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
fdc0: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
fdd0: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
fde0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
fdf0: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
fe00: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
fe10: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
fe20: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
fe30: 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
fe40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fe50: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
fe60: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74 32  >pgno);.    put2
fe70: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
fe80: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
fe90: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
fea0: 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a  [hdr+5], iEnd);.
feb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
fec0: 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66  Insert the new f
fed0: 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68  reeblock into th
fee0: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
fef0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ff00: 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b  [iPtr], iStart);
ff10: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
ff20: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72  ata[iStart], iFr
ff30: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
ff40: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
ff50: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
ff60: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
ff70: 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20   += iOrigSize;. 
ff80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ff90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
ffa0: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
ffb0: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
ffc0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
ffd0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
ffe0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
fff0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
10000 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
10010 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
10020 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
10030 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
10040 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
10050 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
10060 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
10070 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
10080 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
10090 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
100a0 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
100b0 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
100c0 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
100d0 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
100e0 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
100f0 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
10100 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
10110 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
10120 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
10130 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
10140 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
10150 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
10160 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
10170 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
10180 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
10190 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
101a0 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
101b0 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
101c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
101d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
101e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
101f0 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
10200 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
10210 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
10220 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
10230 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
10240 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
10250 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
10260 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
10270 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e  >leaf;.  pPage->
10280 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c  xCellSize = cell
10290 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d  SizePtr;.  pBt =
102a0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
102b0 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
102c0 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
102d0 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
102e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
102f0 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41 20  R-07291-35328 A 
10300 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35  value of 5 (0x05
10310 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
10320 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e   is an.    ** in
10330 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74  terior table b-t
10340 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
10350 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
10360 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
10370 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20  Y)==5 );.    /* 
10380 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
10390 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c  6900-09176 A val
103a0 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29 20  ue of 13 (0x0d) 
103b0 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
103c0 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20  s a.    ** leaf 
103d0 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67  table b-tree pag
103e0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
103f0 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  ( (PTF_LEAFDATA|
10400 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
10410 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20  EAF)==13 );.    
10420 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
10430 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
10440 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
10450 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
10460 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61  f = 1;.      pPa
10470 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
10480 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
10490 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  tr;.    }else{. 
104a0 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
104b0 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
104c0 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
104d0 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
104e0 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20  NoPayload;.     
104f0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
10500 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
10510 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  ellPtrNoPayload;
10520 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
10530 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
10540 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
10550 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
10560 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
10570 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
10580 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
10590 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  A ){.    /* EVID
105a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36  ENCE-OF: R-43316
105b0 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f  -37308 A value o
105c0 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73  f 2 (0x02) means
105d0 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a   the page is an.
105e0 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20      ** interior 
105f0 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
10600 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
10610 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29  ( (PTF_ZERODATA)
10620 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==2 );.    /* EV
10630 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36  IDENCE-OF: R-596
10640 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65  15-42828 A value
10650 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d 65   of 10 (0x0a) me
10660 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
10670 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e  a.    ** leaf in
10680 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
10690 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
106a0 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54  (PTF_ZERODATA|PT
106b0 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20  F_LEAF)==10 );. 
106c0 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
106d0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
106e0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b  >intKeyLeaf = 0;
106f0 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72  .    pPage->xPar
10700 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
10710 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b  rseCellPtrIndex;
10720 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
10730 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
10740 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
10750 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
10760 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  >minLocal;.  }el
10770 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  se{.    /* EVIDE
10780 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d  NCE-OF: R-47608-
10790 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20  56469 Any other 
107a0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d  value for the b-
107b0 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20 69  tree page type i
107c0 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  s.    ** an erro
107d0 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  r. */.    return
107e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
107f0 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
10800 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
10810 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
10820 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
10830 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
10840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10850 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
10860 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
10870 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
10880 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
10890 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
108a0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
108b0 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
108c0 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
108d0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
108e0 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
108f0 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
10900 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
10910 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
10920 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
10930 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
10940 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
10950 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
10960 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
10970 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
10980 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
10990 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
109a0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
109b0 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
109c0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
109d0 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  age){.  int pc; 
109e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
109f0 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
10a00 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
10a10 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
10a20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
10a30 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
10a40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
10a50 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
10a60 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
10a70 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
10a80 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
10a90 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
10aa0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
10ab0 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
10ac0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
10ad0 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
10ae0 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
10af0 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
10b00 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  */.  u16 cellOff
10b10 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
10b20 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
10b30 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
10b40 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
10b50 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
10b60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10b70 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
10b80 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
10b90 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
10ba0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
10bb0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
10bc0 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
10bd0 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
10be0 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
10bf0 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
10c00 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
10c10 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
10c20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
10c30 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
10c40 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
10c50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10c60 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
10c70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
10c80 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
10c90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10ca0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
10cb0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10cc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10cd0 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
10ce0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
10cf0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
10d00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
10d10 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
10d20 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
10d30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
10d40 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
10d50 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
10d60 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
10d70 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
10d80 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
10d90 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nit==0 );..  pBt
10da0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
10db0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
10dc0 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
10dd0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
10de0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10df0 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
10e00 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
10e10 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
10e20 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  dicating.  ** th
10e30 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
10e40 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63  pe. */.  if( dec
10e50 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
10e60 64 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20  data[hdr]) ){.  
10e70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10e80 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
10e90 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ge->pgno);.  }. 
10ea0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
10eb0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
10ec0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
10ed0 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
10ee0 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
10ef0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
10f00 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f   1);.  pPage->nO
10f10 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75  verflow = 0;.  u
10f20 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
10f30 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
10f40 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
10f50 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
10f60 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d  hdr + 8 + pPage-
10f70 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
10f80 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
10f90 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
10fa0 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
10fb0 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
10fc0 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70  cellOffset];.  p
10fd0 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
10fe0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
10ff0 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
11000 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
11010 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
11020 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
11030 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
11040 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74  esignates.  ** t
11050 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
11060 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
11070 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20  a. A zero value 
11080 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72  for this integer
11090 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72   is.  ** interpr
110a0 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
110b0 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
110c0 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
110d0 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56  hdr+5]);.  /* EV
110e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
110f0 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
11100 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
11110 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
11120 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
11130 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
11140 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65  page. */.  pPage
11150 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
11160 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
11170 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
11180 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
11190 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d  ) ){.    /* To m
111a0 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
111b0 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
111c0 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
111d0 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
111e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
111f0 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
11200 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 74 65 73  pgno);.  }.  tes
11210 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
11220 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
11230 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  ) );.  /* EVIDEN
11240 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35  CE-OF: R-24089-5
11250 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63  7979 If a page c
11260 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
11270 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a   (which is only.
11280 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
11290 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
112a0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
112b0 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
112c0 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66  then the.  ** of
112d0 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
112e0 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
112f0 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
11300 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
11310 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72  .  ** bytes of r
11320 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a  eserved space. *
11330 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
11340 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f  e->nCell>0 || to
11350 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  p==usableSize ||
11360 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a   CORRUPT_DB );..
11370 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
11380 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
11390 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f  ight cause us to
113a0 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
113b0 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  nd.  ** of page 
113c0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
113d0 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ell.  .  **.  **
113e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
113f0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65  lock of code che
11400 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65  cks early to see
11410 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e   if a cell exten
11420 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68 65  ds.  ** past the
11430 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
11440 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
11450 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
11460 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65  T to be .  ** re
11470 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
11480 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46  s..  */.  iCellF
11490 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
114a0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
114b0 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
114c0 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
114d0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d  ;.  if( pBt->db-
114e0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
114f0 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
11500 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11510 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
11520 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
11530 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
11540 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
11550 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
11560 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ell */..    if( 
11570 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
11580 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
11590 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
115a0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
115b0 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
115c0 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
115d0 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
115e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
115f0 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
11600 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11610 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
11620 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
11630 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
11640 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
11650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
11660 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
11670 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
11680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11690 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  z = pPage->xCell
116a0 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74  Size(pPage, &dat
116b0 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 74 65  a[pc]);.      te
116c0 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
116d0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
116e0 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
116f0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
11700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11710 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
11720 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
11730 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11740 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
11750 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
11760 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }  ..  /* Comput
11770 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
11780 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
11790 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  ge.  ** EVIDENCE
117a0 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34  -OF: R-23588-344
117b0 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  50 The two-byte 
117c0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
117d0 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 1 gives the.  
117e0 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
117f0 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
11800 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
11810 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
11820 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65   are no.  ** fre
11830 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63  eblocks. */.  pc
11840 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
11850 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72  a[hdr+1]);.  nFr
11860 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
11870 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
11880 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
11890 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
118a0 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30  ce */.  if( pc>0
118b0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74   ){.    u32 next
118c0 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
118d0 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  pc<iCellFirst ){
118e0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
118f0 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35  CE-OF: R-55530-5
11900 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66  2930 In a well-f
11910 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
11920 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20  e, there will.  
11930 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
11940 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
11950 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
11960 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
11970 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
11980 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11990 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
119a0 70 67 6e 6f 29 3b 20 0a 20 20 20 20 7d 0a 20 20  pgno); .    }.  
119b0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
119c0 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
119d0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
119e0 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66  /* Freeblock off
119f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11a00 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
11a10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11a20 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
11a30 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
11a40 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
11a50 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
11a60 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  );.      size = 
11a70 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
11a80 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72  c+2]);.      nFr
11a90 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
11aa0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78  e;.      if( nex
11ab0 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62  t<=pc+size+3 ) b
11ac0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d  reak;.      pc =
11ad0 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20   next;.    }.   
11ae0 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20   if( next>0 ){. 
11af0 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63       /* Freebloc
11b00 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69  k not in ascendi
11b10 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ng order */.    
11b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11b30 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
11b40 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  ge->pgno);.    }
11b50 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65  .    if( pc+size
11b60 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75  >(unsigned int)u
11b70 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
11b80 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62     /* Last freeb
11b90 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73  lock extends pas
11ba0 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20  t page end */.  
11bb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11bc0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
11bd0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
11be0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20   }.  }..  /* At 
11bf0 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
11c00 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
11c10 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
11c20 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
11c30 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
11c40 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
11c50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
11c60 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
11c70 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63  .  ** the cell-c
11c80 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
11c90 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
11ca0 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
11cb0 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
11cc0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
11cd0 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
11ce0 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
11cf0 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72  ck also.  ** ser
11d00 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
11d10 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
11d20 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
11d30 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
11d40 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
11d50 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
11d60 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
11d70 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
11d80 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75  */.  if( nFree>u
11d90 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
11da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11db0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
11dc0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  e->pgno);.  }.  
11dd0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
11de0 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
11df0 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61 67  llFirst);.  pPag
11e00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
11e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11e20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
11e30 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
11e40 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
11e50 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
11e60 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
11e70 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
11e80 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
11e90 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11ea0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
11eb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
11ec0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
11ed0 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
11ee0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
11ef0 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
11f00 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
11f10 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
11f20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11f30 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
11f40 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
11f50 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
11f60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11f70 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
11f80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
11f90 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
11fa0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11fb0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
11fc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
11fd0 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
11fe0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11ff0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
12000 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
12010 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12020 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12030 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
12040 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
12050 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
12060 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
12070 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
12080 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
12090 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
120a0 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
120b0 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
120c0 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
120d0 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
120e0 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
120f0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
12100 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
12110 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
12120 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
12130 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
12140 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
12150 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
12160 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
12170 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
12180 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
12190 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
121a0 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
121b0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
121c0 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
121d0 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
121e0 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
121f0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
12200 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
12210 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
12220 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
12230 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
12240 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
12250 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
12260 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
12270 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
12280 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
12290 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
122a0 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
122b0 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
122c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
122d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
122e0 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
122f0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
12300 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
12310 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
12320 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
12330 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
12340 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
12350 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
12360 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
12370 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
12380 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
12390 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
123a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
123b0 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
123c0 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65   if( pgno!=pPage
123d0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
123e0 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
123f0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
12400 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70  (pDbPage);.    p
12410 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
12420 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61  pDbPage;.    pPa
12430 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
12440 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
12450 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65   pgno;.    pPage
12460 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
12470 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
12480 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
12490 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  Page->aData==sql
124a0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
124b0 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  (pDbPage) );.  r
124c0 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
124d0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
124e0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
124f0 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
12500 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
12510 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
12520 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
12530 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f  eeded.  See also
12540 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  : btreeGetUnused
12550 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
12560 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
12570 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73  OCONTENT flag is
12580 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
12590 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
125a0 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  re.** about the 
125b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
125c0 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
125d0 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
125e0 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
125f0 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
12600 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
12610 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
12620 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
12630 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
12640 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
12650 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
12660 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
12670 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
12680 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
12690 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
126a0 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
126b0 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
126c0 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
126d0 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
126e0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
126f0 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
12700 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
12710 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
12720 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
12730 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12740 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
12750 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
12760 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
12770 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
12780 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
12790 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
127a0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
127b0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
127c0 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
127d0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
127e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
127f0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
12800 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
12810 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
12820 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
12830 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
12840 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
12850 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12860 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12870 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12880 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12890 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
128a0 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
128b0 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
128c0 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
128d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
128e0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
128f0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
12900 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
12910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12920 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
12930 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
12940 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12950 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
12960 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
12970 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
12980 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
12990 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
129a0 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
129b0 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
129c0 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
129d0 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
129e0 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
129f0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
12a00 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
12a10 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
12a20 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
12a30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12a40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12a50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
12a60 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
12a70 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
12a80 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
12a90 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
12aa0 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
12ab0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
12ac0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
12ad0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12ae0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
12af0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
12b00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12b10 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
12b20 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
12b30 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
12b40 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
12b50 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
12b60 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
12b70 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
12b80 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
12b90 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
12ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
12bb0 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
12bc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12bd0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
12be0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
12bf0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
12c00 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
12c10 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
12c20 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
12c30 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
12c40 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
12c50 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
12c60 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
12c70 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
12c80 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
12c90 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
12ca0 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
12cb0 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
12cc0 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
12cd0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
12ce0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
12cf0 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
12d00 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
12d10 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
12d20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
12d30 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
12d40 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
12d50 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
12d60 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
12d70 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
12d80 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
12d90 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
12da0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12db0 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
12dc0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
12dd0 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
12de0 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
12df0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
12e00 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
12e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
12e20 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
12e30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
12e60 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
12e70 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
12e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12e90 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
12ea0 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
12eb0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ed0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
12ee0 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
12ef0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
12f20 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
12f30 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
12f40 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f60 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
12f70 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
12f80 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
12f90 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
12fa0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12fb0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
12fc0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
12fd0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
12fe0 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50  Page==&pCur->apP
12ff0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
13000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
13010 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
13020 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
13030 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
13040 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
13050 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
13060 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
13070 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
13080 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13090 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
130a0 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
130b0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
130c0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
130d0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
130e0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
130f0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
13100 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
13110 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
13120 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
13130 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
13140 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
13150 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
13160 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
13170 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
13180 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
13190 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
131a0 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
131b0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
131c0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
131d0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
131e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
131f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
13200 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
13210 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
13220 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
13230 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
13240 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
13250 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
13260 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
13270 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
13280 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
13290 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
132a0 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
132b0 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
132c0 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
132d0 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
132e0 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
132f0 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
13300 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
13310 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
13320 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
13330 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
13340 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
13350 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
13360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13370 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f  ORRUPT_PGNO(pgno
13380 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
13390 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
133a0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
133b0 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
133c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
133d0 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50  OK;..getAndInitP
133e0 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  age_error:.  if(
133f0 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50   pCur ) pCur->iP
13400 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73  age--;.  testcas
13410 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20  e( pgno==0 );.  
13420 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
13430 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  || rc==SQLITE_CO
13440 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72  RRUPT );.  retur
13450 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
13460 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
13470 43 55 52 52 45 4e 54 0a 2f 2a 20 0a 2a 2a 20 53  CURRENT./* .** S
13480 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
13490 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 67 6e 6f  the MemPage.pgno
134a0 52 6f 6f 74 20 76 61 72 69 61 62 6c 65 2c 20 69  Root variable, i
134b0 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  f it exists..*/.
134c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4d  static void setM
134d0 65 6d 70 61 67 65 52 6f 6f 74 28 4d 65 6d 50 61  empageRoot(MemPa
134e0 67 65 20 2a 70 50 67 2c 20 75 33 32 20 70 67 6e  ge *pPg, u32 pgn
134f0 6f 52 6f 6f 74 29 7b 0a 20 20 70 50 67 2d 3e 70  oRoot){.  pPg->p
13500 67 6e 6f 52 6f 6f 74 20 3d 20 70 67 6e 6f 52 6f  gnoRoot = pgnoRo
13510 6f 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  ot;.}.#else.# de
13520 66 69 6e 65 20 73 65 74 4d 65 6d 70 61 67 65 52  fine setMempageR
13530 6f 6f 74 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  oot(x,y).#endif.
13540 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
13550 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
13560 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
13570 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
13580 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
13590 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
135a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
135b0 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
135c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
135d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
135e0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
135f0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
13600 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13610 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
13620 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13630 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
13640 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
13650 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
13660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13670 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
13680 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
13690 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
136a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
136b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
136c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
136d0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  x) );.  sqlite3P
136e0 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
136f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
13700 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13710 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
13720 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
13730 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61  f( pPage ) relea
13740 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
13750 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age);.}../*.** G
13760 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67  et an unused pag
13770 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  e..**.** This wo
13780 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74  rks just like bt
13790 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74  reeGetPage() wit
137a0 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a  h the addition:.
137b0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68  **.**   *  If th
137c0 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
137d0 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d  y in use for som
137e0 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c  e other purpose,
137f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
13800 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20       release it 
13810 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
13820 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72  LITE_CURRUPT err
13830 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65  or..**   *  Make
13840 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74   sure the isInit
13850 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a   flag is clear.*
13860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
13870 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
13880 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13890 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
138a0 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
138b0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
138c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
138d0 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
138e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
138f0 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
13900 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
13910 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
13920 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
13930 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
13940 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
13950 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
13960 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
13970 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
13980 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
13990 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
139a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
139b0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
139c0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
139d0 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
139e0 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
139f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13a00 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
13a10 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
13a20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13a40 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
13a50 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
13a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
13a70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
13a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
13a90 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
13aa0 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
13ab0 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
13ac0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
13ad0 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
13ae0 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
13af0 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
13b00 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
13b10 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
13b20 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
13b30 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
13b40 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
13b50 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13b60 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
13b70 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
13b80 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
13b90 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
13ba0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
13bb0 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
13bc0 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
13bd0 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
13be0 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
13bf0 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
13c00 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
13c10 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
13c20 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
13c30 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
13c40 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
13c50 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13c60 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
13c70 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
13c80 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
13c90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13ca0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
13cb0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
13cc0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
13cd0 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
13ce0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13cf0 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
13d00 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
13d10 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
13d20 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
13d30 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
13d40 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
13d50 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
13d60 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
13d70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
13d80 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
13d90 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
13da0 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
13db0 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
13dc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13dd0 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
13de0 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
13df0 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
13e00 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
13e10 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
13e20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
13e30 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
13e40 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
13e50 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
13e60 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
13e70 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
13e80 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
13e90 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
13ea0 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
13eb0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
13ec0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13ed0 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
13ee0 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
13ef0 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
13f00 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
13f10 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
13f20 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
13f30 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
13f40 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
13f50 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
13f60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13f70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
13f80 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
13f90 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
13fa0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13fb0 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
13fc0 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
13fd0 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
13fe0 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
13ff0 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
14000 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
14010 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
14020 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
14030 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
14040 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
14050 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
14060 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
14070 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
14080 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
14090 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
140a0 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
140b0 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
140c0 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
140d0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
140e0 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
140f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
14100 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
14110 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
14120 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
14130 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
14140 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
14150 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
14160 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
14170 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
14180 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
14190 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
141a0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
141b0 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
141c0 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
141d0 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
141e0 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a  ntain bits like.
141f0 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  ** BTREE_OMIT_JO
14200 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52  URNAL and/or BTR
14210 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  EE_MEMORY..**.**
14220 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
14230 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
14240 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
14250 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14260 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
14270 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
14280 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
14290 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
142a0 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
142b0 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
142c0 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
142d0 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
142e0 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
142f0 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
14300 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14310 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
14320 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
14330 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
14340 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
14350 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
14360 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
14370 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
14380 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
14390 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
143a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
143b0 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
143c0 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
143d0 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
143e0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
143f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
14400 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
14410 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
14420 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
14430 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
14440 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
14450 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
14460 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
14470 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
14480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
14490 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
144a0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
144b0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
144c0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
144d0 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
144e0 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
144f0 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
14500 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
14510 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
14520 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
14530 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14550 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
14560 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
14570 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
14580 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
14590 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
145a0 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
145b0 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
145c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
145d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
145e0 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
145f0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
14600 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
14610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
14620 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
14630 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
14640 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14650 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
14660 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
14670 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
14680 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
14690 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
146a0 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
146b0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
146c0 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
146d0 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
146e0 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
146f0 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
14700 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
14710 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
14720 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
14730 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
14740 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
14750 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
14760 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
14770 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
14780 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
14790 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
147a0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
147b0 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
147c0 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
147d0 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
147e0 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
14800 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
14810 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
14820 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20  y(db)).         
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
14840 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
14850 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
14860 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  !=0;.#endif..  a
14870 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
14880 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
14890 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
148a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
148b0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
148c0 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
148d0 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
148e0 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
148f0 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
14900 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
14910 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
14920 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
14930 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
14940 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
14950 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
14960 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
14970 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
14980 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
14990 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
149a0 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
149b0 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
149c0 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
149d0 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
149e0 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
149f0 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
14a00 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
14a10 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45    flags |= BTREE
14a20 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69  _MEMORY;.  }.  i
14a30 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  f( (vfsFlags & S
14a40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
14a50 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d  DB)!=0 && (isMem
14a60 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20  db || isTempDb) 
14a70 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20  ){.    vfsFlags 
14a80 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53  = (vfsFlags & ~S
14a90 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
14aa0 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  DB) | SQLITE_OPE
14ab0 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20  N_TEMP_DB;.  }. 
14ac0 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
14ad0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
14ae0 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
14af0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14b00 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14b10 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
14b20 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
14b30 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
14b40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14b50 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
14b60 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
14b70 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
14b80 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
14b90 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
14ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14bb0 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14bc0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14bd0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
14be0 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
14bf0 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
14c00 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
14c10 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
14c20 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
14c30 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
14c40 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
14c50 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
14c60 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26  ( isTempDb==0 &&
14c70 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20   (isMemdb==0 || 
14c80 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
14c90 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29  _OPEN_URI)!=0) )
14ca0 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
14cb0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
14cc0 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
14cd0 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
14ce0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
14cf0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
14d00 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  +1;.      int nF
14d10 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
14d20 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
14d30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
14d40 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
14d50 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28  lite3Malloc(MAX(
14d60 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46  nFullPathname,nF
14d70 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ilename));.     
14d80 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
14d90 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
14da0 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20  exShared; )..   
14db0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
14dc0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
14dd0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
14de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14df0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
14e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14e10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
14e20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d   }.      if( isM
14e30 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
14e40 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68  memcpy(zFullPath
14e50 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  name, zFilename,
14e60 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   nFilename);.   
14e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14e90 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
14ea0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
14ee0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
14ef0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
14f00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
14f10 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14f20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
14f30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14f40 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
14f50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
14f60 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
14f70 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
14f80 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
14f90 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
14fa0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
14fb0 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
14fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14fd0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
14fe0 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
14ff0 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
15000 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15010 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15020 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
15030 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15040 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
15050 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
15060 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
15070 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
15080 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
15090 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
150a0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
150b0 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
150c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
150d0 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
150e0 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
150f0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
15100 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
15130 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
15140 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
15150 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
15160 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
15170 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
15180 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
15190 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
151a0 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
151b0 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
151c0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
151d0 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
151e0 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15200 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15210 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
15220 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15230 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15240 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
15250 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15260 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
15270 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
15280 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15290 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
152a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
152b0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
152c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
152d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
152e0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
152f0 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
15300 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
15310 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15320 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15340 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
15350 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15360 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
15370 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
15380 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
15390 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
153a0 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
153b0 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
153c0 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
153d0 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
153e0 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
153f0 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
15400 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
15410 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
15420 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
15430 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
15440 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
15450 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
15460 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
15470 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
15480 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
15490 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
154a0 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
154b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
154c0 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
154d0 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
154e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
154f0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
15500 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
15510 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
15520 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
15530 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
15540 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
15550 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
15560 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
15570 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
15580 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
15590 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
155a0 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
155b0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
155c0 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
155d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
155e0 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b  izeof(u64)==8 );
155f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
15600 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
15610 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15620 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
15630 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
15640 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
15650 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
15660 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
15670 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
15680 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
15690 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
156a0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
156b0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
156c0 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
156d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
156e0 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
156f0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
15700 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c  sizeof(MemPage),
15730 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
15740 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
15750 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15760 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
15770 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
15780 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
15790 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
157a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
157b0 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
157c0 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
157d0 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
157e0 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
157f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
15800 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15810 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
15820 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
15830 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
15840 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
15850 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
15860 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
15870 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
15880 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
15890 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
158a0 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
158b0 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
158c0 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
158d0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
158e0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
158f0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
15900 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
15910 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
15920 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
15930 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64  READ_ONLY;.#if d
15940 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45  efined(SQLITE_SE
15950 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20  CURE_DELETE).   
15960 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
15970 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
15980 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  ETE;.#elif defin
15990 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53  ed(SQLITE_FAST_S
159a0 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20  ECURE_DELETE).  
159b0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
159c0 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  |= BTS_OVERWRITE
159d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
159e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
159f0 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70  1873-39618 The p
15a00 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64  age size for a d
15a10 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
15a20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
15a30 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20  d by the 2-byte 
15a40 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20  integer located 
15a50 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
15a60 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20  16 bytes from.  
15a70 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69    ** the beginni
15a80 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
15a90 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
15aa0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
15ab0 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c  (zDbHeader[16]<<
15ac0 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b  8) | (zDbHeader[
15ad0 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
15ae0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
15af0 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
15b00 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
15b10 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
15b20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
15b30 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
15b40 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
15b50 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
15b60 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
15b70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
15b80 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
15b90 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
15ba0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
15bb0 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
15bc0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
15bd0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
15be0 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
15bf0 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
15c00 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
15c10 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
15c20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
15c30 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
15c40 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
15c50 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
15c60 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
15c70 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
15c80 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
15c90 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
15ca0 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
15cb0 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
15cc0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
15cd0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
15ce0 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
15cf0 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
15d00 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
15d10 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
15d20 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
15d30 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
15d40 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
15d50 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
15d60 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
15d70 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
15d80 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
15d90 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
15da0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
15db0 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
15dc0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
15dd0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
15de0 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
15df0 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
15e00 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
15e10 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  gion is.      **
15e20 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
15e30 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
15e40 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
15e50 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
15e60 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69  of 20.      ** i
15e70 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
15e80 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
15e90 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
15ea0 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
15eb0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
15ec0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
15ed0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
15ee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ef0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
15f00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
15f10 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
15f20 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
15f30 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
15f40 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
15f50 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
15f60 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
15f70 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
15f80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
15f90 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
15fa0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
15fb0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
15fc0 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
15fd0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
15fe0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
15ff0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
16000 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
16010 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
16020 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
16030 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
16040 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
16050 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
16060 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
16070 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16080 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16090 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
160a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
160b0 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
160c0 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
160d0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
160e0 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
160f0 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
16100 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52    */.    pBt->nR
16110 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ef = 1;.    if( 
16120 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
16130 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
16140 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
16150 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
16160 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
16170 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d  C( mutexShared =
16180 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
16190 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
161a0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29  STATIC_MASTER);)
161b0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
161c0 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
161d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
161e0 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
161f0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
16200 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
16210 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
16220 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
16230 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
16240 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
16250 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16260 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
16270 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
16280 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
16290 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
162a0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
162b0 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
162c0 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
162d0 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
162e0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
162f0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
16300 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
16310 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
16320 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
16330 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
16340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
16350 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
16360 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
16370 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
16380 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16390 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
163a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
163b0 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
163c0 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
163d0 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
163e0 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
163f0 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
16400 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
16410 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
16420 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
16430 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
16440 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
16450 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
16460 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
16470 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
16480 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
16490 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
164a0 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
164b0 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
164c0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
164d0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
164e0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
164f0 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
16500 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
16510 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
16520 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
16530 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
16540 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70 74          if( (upt
16550 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  r)p->pBt<(uptr)p
16560 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
16570 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
16580 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
16590 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
165a0 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
165b0 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
165c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
165d0 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
165e0 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29 70  pNext && (uptr)p
165f0 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
16600 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a  (uptr)p->pBt ){.
16610 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
16620 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
16630 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16640 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
16650 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
16660 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
16670 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
16680 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
16690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
166a0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
166b0 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
166c0 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
166d0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
166e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
166f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16700 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
16710 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
16720 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
16730 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16740 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
16750 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
16760 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16770 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
16780 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
16790 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
167a0 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
167b0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
167c0 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
167d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
167e0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
167f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
16800 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
16810 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
16820 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
16830 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
16840 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
16850 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77  value. Except, w
16860 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61  hen opening on a
16870 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65  n existing share
16880 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20  d pager-cache,. 
16890 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61     ** do not cha
168a0 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
168b0 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  che size..    */
168c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
168d0 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30  BtreeSchema(p, 0
168e0 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
168f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16900 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74  Cachesize(p->pBt
16910 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
16920 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
16930 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  IZE);.    }..   
16940 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   pFile = sqlite3
16950 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
16960 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
16970 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
16980 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16990 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
169a0 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  t(pFile, SQLITE_
169b0 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64  FCNTL_PDB, (void
169c0 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20  *)&pBt->db);.   
169d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
169e0 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
169f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16a00 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
16a10 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
16a20 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
16a30 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
16a40 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
16a50 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
16a60 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e  3BtreeConnection
16a70 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e  Count(*ppBtree)>
16a80 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
16a90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
16aa0 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
16ab0 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
16ac0 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
16ad0 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
16ae0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
16af0 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
16b00 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
16b10 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
16b20 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
16b30 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
16b40 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
16b50 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
16b60 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
16b70 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
16b80 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
16b90 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
16ba0 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
16bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
16bc0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54  ARED_CACHE.  MUT
16bd0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
16be0 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
16bf0 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ; ).  BtShared *
16c00 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
16c10 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
16c20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16c30 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
16c40 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45  mutex) );.  MUTE
16c50 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
16c60 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
16c70 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
16c80 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
16c90 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
16ca0 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
16cb0 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
16cc0 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
16cd0 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
16ce0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
16cf0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
16d00 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29  acheList)==pBt )
16d10 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  {.      GLOBAL(B
16d20 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
16d30 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
16d40 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
16d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16d60 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pList = GLOBAL(B
16d70 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
16d80 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
16d90 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
16da0 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
16db0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
16dc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
16dd0 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
16de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16df0 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
16e00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
16e10 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
16e20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
16e30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
16e40 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
16e50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
16e60 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
16e70 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
16e80 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
16e90 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
16ea0 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
16eb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
16ec0 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
16ed0 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
16ee0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16ef0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16f00 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
16f10 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
16f20 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
16f30 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d   bytes with a 4-
16f40 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20  byte prefix for 
16f50 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20  a left-child.** 
16f60 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
16f70 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
16f80 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
16f90 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
16fa0 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
16fb0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
16fc0 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
16fd0 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
16fe0 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  pageSize );..   
16ff0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75   /* One of the u
17000 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70  ses of pBt->pTmp
17010 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d  Space is to form
17020 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a  at cells before.
17030 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67      ** inserting
17040 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61   them into a lea
17050 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e  f page (function
17060 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20   fillInCell()). 
17070 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c  If.    ** a cell
17080 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20   is less than 4 
17090 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69  bytes in size, i
170a0 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20  t is rounded up 
170b0 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a  to 4 bytes.    *
170c0 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  * by the various
170d0 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d   routines that m
170e0 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79  anipulate binary
170f0 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20   cells. Which.  
17100 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68    ** can mean th
17110 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  at fillInCell() 
17120 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73  only initializes
17130 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20   the first 2 or 
17140 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  3.    ** bytes o
17150 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74  f pTmpSpace, but
17160 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
17170 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69  4 bytes are copi
17180 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69  ed from.    ** i
17190 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73  t into a databas
171a0 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20  e page. This is 
171b0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70  not actually a p
171c0 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20  roblem, but it. 
171d0 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65     ** does cause
171e0 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f   a valgrind erro
171f0 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20  r when the 1 or 
17200 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69  2 bytes of uniti
17210 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64  alized .    ** d
17220 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f  ata is passed to
17230 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69   system call wri
17240 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69  te(). So to avoi
17250 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20  d this error,.  
17260 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69    ** zero the fi
17270 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
17280 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a  emp space here..
17290 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
172a0 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75  so:  Provide fou
172b0 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69  r bytes of initi
172c0 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66  alized space bef
172d0 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62  ore the.    ** b
172e0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70  eginning of pTmp
172f0 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61  Space as an area
17300 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72   available to pr
17310 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  epend the.    **
17320 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e   left-child poin
17330 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ter to the begin
17340 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a  ning of a cell..
17350 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
17360 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
17370 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42  .      memset(pB
17380 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c  t->pTmpSpace, 0,
17390 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   8);.      pBt->
173a0 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a  pTmpSpace += 4;.
173b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
173c0 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
173d0 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
173e0 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
173f0 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
17400 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
17410 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54  ){.  if( pBt->pT
17420 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
17430 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d  Bt->pTmpSpace -=
17440 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   4;.    sqlite3P
17450 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d  ageFree(pBt->pTm
17460 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74  pSpace);.    pBt
17470 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
17480 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
17490 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
174a0 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
174b0 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
174c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
174d0 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
174e0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
174f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
17500 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
17510 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
17520 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
17530 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
17540 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
17550 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17560 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
17570 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17580 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
17590 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
175a0 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
175b0 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
175c0 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
175d0 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
175e0 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
175f0 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
17600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
17610 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
17620 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
17630 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
17640 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
17650 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
17660 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
17670 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
17680 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
17690 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
176a0 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
176b0 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
176c0 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
176d0 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
176e0 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49  Rollback(p, SQLI
176f0 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  TE_OK, 0);.  sql
17700 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17710 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
17720 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
17730 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
17740 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
17750 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
17760 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
17770 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
17780 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
17790 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
177a0 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
177b0 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
177c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
177d0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
177e0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
177f0 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
17800 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
17810 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
17820 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
17830 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
17840 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
17850 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
17860 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
17870 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
17880 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
17890 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
178a0 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
178b0 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
178c0 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
178d0 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
178e0 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
178f0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
17900 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
17910 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70  ->db);.    if( p
17920 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
17930 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
17940 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
17950 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
17960 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
17970 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17980 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
17990 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
179a0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
179b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
179c0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
179d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
179e0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
179f0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
17a00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17a10 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
17a20 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
17a30 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
17a40 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
17a50 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
17a60 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
17a70 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
17a80 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
17a90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
17aa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17ab0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f  * Change the "so
17ac0 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ft" limit on the
17ad0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
17ae0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
17af0 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d  * Unused and unm
17b00 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69  odified pages wi
17b10 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77  ll be recycled w
17b20 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
17b30 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68  f.** pages in th
17b40 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20  e cache exceeds 
17b50 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e  this soft limit.
17b60 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f    But the size o
17b70 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69  f the.** cache i
17b80 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f  s allowed to gro
17b90 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  w larger than th
17ba0 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63  is limit if it c
17bb0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79  ontains.** dirty
17bc0 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20   pages or pages 
17bd0 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20  still in active 
17be0 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
17bf0 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
17c00 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
17c10 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
17c20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17c30 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
17c40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17c50 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
17c60 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
17c70 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
17c80 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
17c90 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
17ca0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
17cb0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17cc0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
17cd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17ce0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70  * Change the "sp
17cf0 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  ill" limit on th
17d00 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
17d10 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
17d20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
17d30 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64   of pages exceed
17d40 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72  s this limit dur
17d50 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
17d60 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  saction,.** the 
17d70 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65  pager might atte
17d80 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70  mpt to "spill" p
17d90 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  ages to the jour
17da0 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20  nal early in.** 
17db0 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
17dc0 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
17dd0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
17de0 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74  d is the current
17df0 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66   spill size.  If
17e00 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a   zero is passed.
17e10 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ** as an argumen
17e20 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
17e30 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70  e made to the sp
17e40 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67  ill size setting
17e50 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78  , so.** using mx
17e60 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77  Page of 0 is a w
17e70 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ay to query the 
17e80 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
17e90 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ze..*/.int sqlit
17ea0 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
17eb0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
17ec0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
17ed0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17ee0 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  pBt;.  int res;.
17ef0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17f00 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
17f10 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
17f20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17f30 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  r(p);.  res = sq
17f40 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
17f50 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  llsize(pBt->pPag
17f60 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
17f70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17f80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (p);.  return re
17f90 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  s;.}..#if SQLITE
17fa0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
17fb0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17fc0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
17fd0 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
17fe0 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
17ff0 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
18000 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
18010 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
18020 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
18030 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
18040 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
18050 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18060 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
18070 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18080 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
18090 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
180a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
180b0 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
180c0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
180d0 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
180e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
180f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18100 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
18110 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
18120 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
18130 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
18140 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
18150 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
18160 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
18170 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
18180 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
18190 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
181a0 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
181b0 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
181c0 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
181d0 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
181e0 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
181f0 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
18200 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
18210 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
18220 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
18230 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
18240 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
18250 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
18260 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
18270 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
18280 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
18290 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
182a0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
182b0 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
182c0 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
182d0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
182e0 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
182f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18300 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
18310 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18320 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
18330 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
18340 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
18350 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
18360 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
18370 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
18380 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
18390 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
183a0 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
183b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
183c0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
183d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
183e0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
183f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18400 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
18410 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
18420 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
18430 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
18440 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18460 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
18470 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
18480 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
18490 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
184a0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
184b0 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
184c0 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
184d0 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
184e0 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
184f0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
18500 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
18510 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
18520 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
18530 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
18540 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
18550 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
18560 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
18570 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
18580 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
18590 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
185a0 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
185b0 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
185c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
185d0 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
185e0 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
185f0 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
18600 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
18610 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18620 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
18630 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
18640 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
18650 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
18660 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
18670 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
18680 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
18690 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
186a0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
186b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
186c0 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
186d0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
186e0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
186f0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
18700 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
18710 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
18720 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
18730 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
18740 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  he BTS_PAGESIZE_
18750 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65  FIXED flag is se
18760 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
18770 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
18780 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
18790 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
187a0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
187b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
187c0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
187d0 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
187e0 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
187f0 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
18800 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18810 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18820 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
18830 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
18840 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
18850 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
18860 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20  eeEnter(p);.#if 
18870 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18880 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e  .  if( nReserve>
18890 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
188a0 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d  rve ) pBt->optim
188b0 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29  alReserve = (u8)
188c0 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  nReserve;.#endif
188d0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
188e0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
188f0 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20  IZE_FIXED ){.   
18900 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18910 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
18920 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
18930 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
18940 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
18950 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
18960 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
18970 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
18980 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
18990 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
189a0 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
189b0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
189c0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
189d0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
189e0 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
189f0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
18a00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
18a10 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
18a20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
18a30 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
18a40 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
18a50 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
18a60 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
18a70 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
18a80 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
18a90 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
18aa0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
18ab0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
18ac0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
18ad0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
18ae0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
18af0 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
18b00 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
18b10 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
18b20 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
18b30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18b40 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18b50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
18b60 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
18b70 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
18b80 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
18b90 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
18ba0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
18bb0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
18bc0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
18bd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
18be0 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
18bf0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
18c00 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74  eserve(), except
18c10 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20   that it.** may 
18c20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69  only be called i
18c30 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  f it is guarante
18c40 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72  ed that the b-tr
18c50 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65  ee mutex is alre
18c60 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a  ady.** held..**.
18c70 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75  ** This is usefu
18c80 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c  l in one special
18c90 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63   case in the bac
18ca0 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65  kup API code whe
18cb0 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77  re it is.** know
18cc0 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65  n that the share
18cd0 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
18ce0 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20  s held, but the 
18cf0 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a  mutex on the .**
18d00 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
18d10 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73   that owns *p is
18d20 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61   not. In this ca
18d30 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72  se if sqlite3Btr
18d40 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72  eeEnter().** wer
18d50 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20  e to be called, 
18d60 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65  it might collide
18d70 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72   with some other
18d80 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
18d90 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  e.** database ha
18da0 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
18db0 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66  p, causing undef
18dc0 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a  ined behavior..*
18dd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18de0 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
18df0 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tex(Btree *p){. 
18e00 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74   int n;.  assert
18e10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18e20 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
18e30 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  ex) );.  n = p->
18e40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
18e50 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
18e60 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ze;.  return n;.
18e70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18e80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18e90 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
18ea0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
18eb0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
18ec0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
18ed0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
18ee0 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
18ef0 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
18f00 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
18f10 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
18f20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
18f30 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64  E_HAS_MUTEX is d
18f40 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20  efined then the 
18f50 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
18f60 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65  is the.** greate
18f70 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  r of the current
18f80 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
18f90 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
18fa0 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73  requested.** res
18fb0 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69  erve space..*/.i
18fc0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
18fd0 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  etOptimalReserve
18fe0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
18ff0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
19000 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
19010 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
19020 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
19030 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (p);.#ifdef SQLI
19040 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
19050 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74  f( n<p->pBt->opt
19060 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20  imalReserve ) n 
19070 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  = p->pBt->optima
19080 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  lReserve;.#endif
19090 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
190a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
190b0 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
190c0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
190d0 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
190e0 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
190f0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
19100 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
19110 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
19120 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
19130 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
19140 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
19150 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
19160 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
19170 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
19180 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
19190 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
191a0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
191b0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
191c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
191d0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
191e0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
191f0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
19200 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
19210 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19220 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
19230 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
19240 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42  values for the B
19250 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
19260 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
19270 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  TE flags:.**.** 
19280 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20     newFlag==0   
19290 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43      Both BTS_SEC
192a0 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42  URE_DELETE and B
192b0 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65  TS_OVERWRITE are
192c0 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e   cleared.**    n
192d0 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20  ewFlag==1       
192e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
192f0 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56  E set and BTS_OV
19300 45 52 57 52 49 54 45 20 69 73 20 63 6c 65 61 72  ERWRITE is clear
19310 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  ed.**    newFlag
19320 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53 45  ==2       BTS_SE
19330 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61  CURE_DELETE clea
19340 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  red and BTS_OVER
19350 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20  WRITE is set.** 
19360 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29     newFlag==(-1)
19370 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a      No changes.*
19380 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19390 65 20 61 63 74 73 20 61 73 20 61 20 71 75 65 72  e acts as a quer
193a0 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  y if newFlag is 
193b0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a  less than zero.*
193c0 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56  *.** With BTS_OV
193d0 45 52 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c  ERWRITE set, del
193e0 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20  eted content is 
193f0 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a  overwritten by z
19400 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65  eros, but.** fre
19410 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  elist leaf pages
19420 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e   are not written
19430 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
19440 61 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d  abase.  Thus in-
19450 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  page.** deleted 
19460 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72  content is clear
19470 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74  ed, but freelist
19480 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74   deleted content
19490 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57   is not..**.** W
194a0 69 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44  ith BTS_SECURE_D
194b0 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e  ELETE, operation
194c0 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45   is like BTS_OVE
194d0 52 57 52 49 54 45 20 77 69 74 68 20 74 68 65 20  RWRITE with the 
194e0 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74  addition.** that
194f0 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70   freelist leaf p
19500 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
19510 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
19520 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73  atabase, increas
19530 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e  ing.** the amoun
19540 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a  t of disk I/O..*
19550 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19560 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
19570 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
19580 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
19590 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
195a0 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
195b0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
195c0 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45   assert( BTS_OVE
195d0 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55  RWRITE==BTS_SECU
195e0 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20  RE_DELETE*2 );. 
195f0 20 61 73 73 65 72 74 28 20 42 54 53 5f 46 41 53   assert( BTS_FAS
19600 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f  T_SECURE==(BTS_O
19610 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43  VERWRITE|BTS_SEC
19620 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20  URE_DELETE) );. 
19630 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
19640 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
19650 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
19660 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20  FAST_SECURE;.   
19670 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
19680 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
19690 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a  DELETE*newFlag;.
196a0 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42    }.  b = (p->pB
196b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
196c0 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42  S_FAST_SECURE)/B
196d0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
196e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
196f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19700 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn b;.}../*.** C
19710 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
19720 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
19730 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19740 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
19750 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
19760 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
19770 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
19780 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
19790 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
197a0 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
197b0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
197c0 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
197d0 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
197e0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
197f0 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
19800 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
19810 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
19820 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
19830 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
19840 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
19850 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
19860 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
19870 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19880 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
19890 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
198a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
198b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
198c0 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
198d0 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
198e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
198f0 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e  p);.  if( (pBt->
19900 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
19910 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d  AGESIZE_FIXED)!=
19920 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  0 && (av ?1:0)!=
19930 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
19940 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19950 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
19960 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
19970 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
19980 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
19990 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
199a0 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
199b0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
199c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
199d0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
199e0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
199f0 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
19a00 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
19a10 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
19a20 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
19a30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
19a40 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
19a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
19a60 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
19a70 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
19a80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19a90 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
19aa0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
19ab0 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
19ac0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
19ad0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
19ae0 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
19af0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
19b00 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
19b10 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
19b20 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
19b30 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
19b40 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
19b50 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
19b60 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
19b70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19b80 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
19b90 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  f.}../*.** If th
19ba0 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73  e user has not s
19bb0 65 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65  et the safety-le
19bc0 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74  vel for this dat
19bd0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
19be0 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d  .** using "PRAGM
19bf0 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20  A synchronous", 
19c00 61 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74  and if the safet
19c10 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61  y-level is not a
19c20 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f  lready.** set to
19c30 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
19c40 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
19c50 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  on as the second
19c60 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73   parameter,.** s
19c70 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66  et it so..*/.#if
19c80 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
19c90 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c  SYNCHRONOUS!=SQL
19ca0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
19cb0 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 73 74 61 74  SYNCHRONOUS.stat
19cc0 69 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75  ic void setDefau
19cd0 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61  ltSyncFlag(BtSha
19ce0 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66  red *pBt, u8 saf
19cf0 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71  ety_level){.  sq
19d00 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
19d10 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d  *pDb;.  if( (db=
19d20 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28  pBt->db)!=0 && (
19d30 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20  pDb=db->aDb)!=0 
19d40 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44  ){.    while( pD
19d50 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62  b->pBt==0 || pDb
19d60 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20  ->pBt->pBt!=pBt 
19d70 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20  ){ pDb++; }.    
19d80 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65  if( pDb->bSyncSe
19d90 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44  t==0 .     && pD
19da0 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  b->safety_level!
19db0 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20  =safety_level . 
19dc0 20 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d      && pDb!=&db-
19dd0 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a  >aDb[1] .    ){.
19de0 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74        pDb->safet
19df0 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79  y_level = safety
19e00 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71  _level;.      sq
19e10 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
19e20 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a  gs(pBt->pPager,.
19e30 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
19e40 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64  afety_level | (d
19e50 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52  b->flags & PAGER
19e60 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20  _FLAGS_MASK));. 
19e70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
19e80 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66  .# define setDef
19e90 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
19ea0 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23  ,safety_level).#
19eb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  endif../*.** Get
19ec0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
19ed0 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
19ee0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
19ef0 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
19f00 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
19f10 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
19f20 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
19f30 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
19f40 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
19f50 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
19f60 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
19f70 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
19f80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19f90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
19fa0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
19fb0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
19fc0 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
19fd0 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
19fe0 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
19ff0 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
1a000 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
1a010 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
1a020 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
1a030 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1a040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1a050 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
1a060 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
1a070 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1a080 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
1a090 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a0a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
1a0b0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
1a0c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1a0d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1a0e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46   */.  int nPageF
1a0f0 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
1a100 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1a110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a120 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
1a130 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
1a140 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1a150 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1a160 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
1a170 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1a180 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1a190 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1a1a0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a1b0 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
1a1c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a1d0 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
1a1e0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
1a1f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1a200 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
1a210 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1a220 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1a230 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a240 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1a250 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
1a260 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
1a270 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
1a280 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
1a290 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
1a2a0 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
1a2b0 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
1a2c0 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
1a2d0 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
1a2e0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
1a2f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1a300 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1a310 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
1a320 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d  e);.  if( nPage=
1a330 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b  =0 || memcmp(24+
1a340 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1a350 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67  ta, 92+(u8*)pPag
1a360 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20  e1->aData,4)!=0 
1a370 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  ){.    nPage = n
1a380 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20  PageFile;.  }.  
1a390 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
1a3a0 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
1a3b0 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
1a3c0 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
1a3d0 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
1a3e0 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
1a3f0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
1a400 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a410 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76  R-43737-39999 Ev
1a420 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65  ery valid SQLite
1a430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1a440 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74  egins.    ** wit
1a450 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
1a460 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78  16 bytes (in hex
1a470 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37  ): 53 51 4c 69 7
1a480 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32  4 65 20 66 6f 72
1a490 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34   6d.    ** 61 74
1a4a0 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20   20 33 00. */.  
1a4b0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
1a4c0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
1a4d0 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
1a4e0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1a4f0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1a500 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1a510 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
1a520 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
1a530 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1a540 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
1a550 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
1a560 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
1a570 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1a580 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1a590 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
1a5a0 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
1a5b0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
1a5c0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
1a5d0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
1a5e0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
1a5f0 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
1a600 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1a610 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
1a620 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
1a630 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
1a640 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
1a650 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
1a660 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
1a670 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
1a680 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
1a690 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
1a6a0 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
1a6b0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
1a6c0 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
1a6d0 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
1a6e0 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
1a6f0 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
1a700 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
1a710 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
1a720 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
1a730 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
1a740 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
1a750 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
1a760 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
1a770 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
1a780 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
1a790 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
1a7a0 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
1a7b0 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
1a7c0 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
1a7d0 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
1a7e0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
1a7f0 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
1a800 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
1a810 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
1a820 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
1a830 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a840 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
1a850 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
1a860 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
1a870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a880 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1a890 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1a8a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a8b0 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74        setDefault
1a8c0 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51  SyncFlag(pBt, SQ
1a8d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
1a8e0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
1a8f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
1a900 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
1a910 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a920 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
1a930 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a940 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
1a950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1a960 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
1a970 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a980 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63    setDefaultSync
1a990 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45  Flag(pBt, SQLITE
1a9a0 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
1a9b0 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23  NOUS+1);.    }.#
1a9c0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
1a9d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
1a9e0 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
1a9f0 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
1aa00 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
1aa10 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
1aa20 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
1aa30 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
1aa40 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1aa50 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
1aa60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1aa70 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
1aa80 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
1aa90 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
1aaa0 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
1aab0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
1aac0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
1aad0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
1aae0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
1aaf0 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
1ab00 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
1ab10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
1ab20 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1ab30 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1ab40 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1ab50 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
1ab60 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
1ab70 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1ab80 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
1ab90 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
1aba0 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
1abb0 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
1abc0 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
1abd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
1abe0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
1abf0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1ac00 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
1ac10 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
1ac20 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
1ac30 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1ac40 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
1ac50 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
1ac60 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
1ac70 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
1ac80 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
1ac90 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
1aca0 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
1acb0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
1acc0 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
1acd0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
1ace0 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
1acf0 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
1ad00 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
1ad10 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1ad20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1ad30 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
1ad40 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
1ad50 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1ad60 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35  F: R-59310-51205
1ad70 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73   The "reserved s
1ad80 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68  pace" size in th
1ad90 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20  e 1-byte.    ** 
1ada0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
1adb0 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62  t 20 is the numb
1adc0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
1add0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
1ade0 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70  of.    ** each p
1adf0 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66  age to reserve f
1ae00 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a  or extensions. .
1ae10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56      **.    ** EV
1ae20 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
1ae30 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
1ae40 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
1ae50 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
1ae60 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
1ae70 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
1ae80 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
1ae90 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
1aea0 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69  t of 20.    ** i
1aeb0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
1aec0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
1aed0 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
1aee0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
1aef0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
1af00 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
1af10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
1af20 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
1af30 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
1af40 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1af50 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
1af60 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
1af70 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
1af80 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
1af90 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
1afa0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
1afb0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
1afc0 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
1afd0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
1afe0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
1aff0 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
1b000 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
1b010 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
1b020 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
1b030 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
1b040 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
1b050 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1b060 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
1b070 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
1b080 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
1b090 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
1b0a0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
1b0b0 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
1b0c0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1b0d0 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
1b0e0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
1b0f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b100 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
1b110 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
1b120 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b150 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
1b160 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
1b170 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1b180 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
1b190 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
1b1a0 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 20 26 26  iteSchema)==0 &&
1b1b0 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
1b1c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1b1d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1b1e0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
1b1f0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1b200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
1b210 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
1b220 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65  312-64704 Howeve
1b230 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69  r, the usable si
1b240 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ze is not allowe
1b250 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c  d to.    ** be l
1b260 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e  ess than 480. In
1b270 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
1b280 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
1b290 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a  s 512, then the.
1b2a0 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20      ** reserved 
1b2b0 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f  space size canno
1b2c0 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a  t exceed 32. */.
1b2d0 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
1b2e0 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
1b2f0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1b300 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1b310 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
1b320 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
1b330 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1b340 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
1b350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b360 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1b370 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1b380 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
1b390 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
1b3a0 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
1b3b0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
1b3c0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
1b3d0 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
1b3e0 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
1b3f0 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
1b400 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
1b410 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
1b420 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
1b430 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
1b440 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
1b450 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
1b460 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
1b470 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
1b480 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
1b490 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
1b4a0 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
1b4b0 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
1b4c0 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
1b4d0 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
1b4e0 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
1b4f0 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
1b500 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
1b510 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
1b520 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
1b530 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
1b540 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
1b550 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
1b560 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
1b570 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
1b580 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
1b590 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
1b5a0 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
1b5b0 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
1b5c0 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
1b5d0 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
1b5e0 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
1b5f0 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
1b600 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
1b610 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
1b620 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
1b630 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
1b640 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
1b650 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1b660 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
1b670 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
1b680 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
1b690 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
1b6a0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
1b6b0 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
1b6c0 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
1b6d0 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
1b6e0 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
1b6f0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1b700 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
1b710 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
1b720 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
1b730 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
1b740 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
1b750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
1b760 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
1b770 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
1b780 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
1b790 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
1b7a0 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
1b7b0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
1b7c0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
1b7d0 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
1b7e0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1b7f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b800 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
1b810 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
1b820 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
1b830 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1b840 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1b850 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
1b860 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1b870 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
1b880 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
1b890 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
1b8a0 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
1b8b0 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
1b8c0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
1b8d0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
1b8e0 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
1b8f0 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
1b900 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1b910 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
1b920 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
1b930 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
1b940 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
1b950 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
1b960 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
1b970 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
1b980 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
1b990 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
1b9a0 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
1b9b0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1b9c0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1b9d0 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
1b9e0 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
1b9f0 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
1ba00 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
1ba10 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
1ba20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1ba30 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
1ba40 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
1ba50 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
1ba60 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1ba70 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1ba80 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1ba90 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1baa0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1bab0 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
1bac0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
1bad0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
1bae0 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
1baf0 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
1bb00 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
1bb10 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
1bb20 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
1bb30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
1bb40 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
1bb50 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
1bb60 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
1bb70 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
1bb80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
1bb90 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
1bba0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1bbb0 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
1bbc0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
1bbd0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
1bbe0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1bbf0 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
1bc00 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
1bc10 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
1bc20 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
1bc30 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1bc40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1bc50 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
1bc60 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1bc70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bc80 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1bc90 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
1bca0 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
1bcb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1bcc0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1bcd0 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
1bce0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
1bcf0 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
1bd00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
1bd10 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
1bd20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1bd30 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1bd40 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
1bd50 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
1bd60 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1bd70 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
1bd80 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
1bd90 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
1bda0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1bdb0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1bdc0 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
1bdd0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1bde0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
1bdf0 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20  Null(pPage1);.  
1be00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1be10 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1be20 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1be30 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1be40 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1be50 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1be60 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1be70 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1be80 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1be90 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1bea0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1beb0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1bec0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1bed0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1bee0 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1bef0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1bf00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1bf10 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1bf20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1bf30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1bf40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1bf50 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1bf60 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1bf70 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1bf80 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1bf90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1bfa0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1bfb0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1bfc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1bfd0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1bfe0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1bff0 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1c000 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1c010 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1c020 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1c030 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1c040 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1c050 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1c060 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1c070 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1c080 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1c090 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1c0a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1c0b0 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1c0c0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1c0d0 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1c0e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1c0f0 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1c100 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1c110 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1c120 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1c130 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1c140 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1c150 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1c160 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1c170 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1c180 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1c190 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1c1a0 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1c1b0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1c1c0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1c1d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c1e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1c1f0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1c200 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1c210 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1c220 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c230 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1c240 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1c250 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1c260 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1c270 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1c280 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1c290 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1c2a0 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1c2b0 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1c2c0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1c2d0 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1c2e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c2f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1c300 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1c310 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1c320 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1c330 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1c340 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1c350 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1c360 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1c370 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1c380 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1c390 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1c3a0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1c3b0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1c3c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c3d0 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1c3e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1c3f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1c400 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1c410 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1c420 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1c430 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1c440 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1c450 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c460 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1c470 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1c480 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1c490 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1c4a0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1c4b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1c4c0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1c4d0 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1c4e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1c4f0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1c500 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1c510 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1c520 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1c530 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1c540 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1c550 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1c560 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1c570 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1c580 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1c590 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1c5a0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1c5b0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1c5c0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1c5d0 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1c5e0 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1c5f0 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1c600 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1c610 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1c620 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1c630 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1c640 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1c650 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1c660 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1c670 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1c680 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1c690 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1c6a0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1c6b0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1c6c0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1c6d0 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1c6e0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1c6f0 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1c700 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1c710 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1c720 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1c730 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1c740 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c750 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1c760 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c770 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1c780 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1c790 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1c7a0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1c7b0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1c7c0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1c7d0 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1c7e0 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1c7f0 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1c800 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1c810 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1c820 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1c830 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1c840 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1c850 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1c860 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1c870 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1c880 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1c890 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1c8a0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1c8b0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1c8c0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1c8d0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1c8e0 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1c8f0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1c900 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1c910 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1c920 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1c930 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1c940 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1c950 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1c960 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1c970 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1c980 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1c990 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1c9a0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1c9b0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1c9c0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1c9d0 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1c9e0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1c9f0 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1ca00 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1ca10 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1ca20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1ca30 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1ca40 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1ca50 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1ca60 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1ca70 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1ca80 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1ca90 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1caa0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1cab0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1cac0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1cad0 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1cae0 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1caf0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1cb00 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1cb10 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1cb20 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
1cb30 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1cb40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1cb50 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 43  ITE_OK;.  int bC
1cb60 6f 6e 63 75 72 72 65 6e 74 20 3d 20 28 70 2d 3e  oncurrent = (p->
1cb70 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
1cb80 26 26 20 21 49 53 41 55 54 4f 56 41 43 55 55 4d  && !ISAUTOVACUUM
1cb90 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  );..  sqlite3Btr
1cba0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1cbb0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1cbc0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
1cbd0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
1cbe0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
1cbf0 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
1cc00 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
1cc10 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1cc20 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
1cc30 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
1cc40 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
1cc50 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
1cc60 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1cc70 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1cc80 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
1cc90 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
1cca0 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
1ccb0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1ccc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1ccd0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1cce0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
1ccf0 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
1cd00 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
1cd10 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
1cd20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1cd30 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1cd40 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1cd50 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1cd60 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1cd70 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1cd80 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1cd90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1cda0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1cdb0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1cdc0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1cdd0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1cde0 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73  _CACHE.  {.    s
1cdf0 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
1ce00 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   0;.    /* If an
1ce10 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1ce20 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1ce30 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1ce40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1ce50 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1ce60 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1ce70 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1ce80 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1ce90 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  on is.    ** req
1cea0 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1ceb0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1cec0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72    */.    if( (wr
1ced0 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
1cee0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1cef0 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c  S_WRITE).     ||
1cf00 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1cf10 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1cf20 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1cf30 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1cf40 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65  iter->db;.    }e
1cf50 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1cf60 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b   ){.      BtLock
1cf70 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66   *pIter;.      f
1cf80 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1cf90 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1cfa0 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1cfb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1cfc0 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1cfd0 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63  .          pBloc
1cfe0 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
1cff0 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  e->db;.         
1d000 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1d010 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1d020 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29      if( pBlock )
1d030 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1d040 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1d050 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1d060 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d070 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1d080 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74  CACHE;.      got
1d090 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1d0a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1d0b0 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1d0c0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1d0d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1d0e0 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1d0f0 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1d100 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1d110 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1d120 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1d130 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1d140 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1d150 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1d160 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1d170 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1d180 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1d190 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1d1a0 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1d1b0 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1d1c0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1d1d0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1d1e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1d1f0 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1d200 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1d210 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1d220 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1d230 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1d240 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1d250 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1d260 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1d270 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1d280 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1d290 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1d2a0 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1d2b0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1d2c0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1d2d0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1d2e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1d2f0 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1d300 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1d310 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1d320 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1d330 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1d340 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1d350 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1d360 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1d370 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1d380 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1d390 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1d3a0 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1d3b0 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1d3c0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1d3d0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1d3e0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1d3f0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1d400 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1d410 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1d420 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1d430 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d440 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1d450 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1d460 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1d470 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1d480 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1d490 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1d4a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1d4b0 20 65 78 46 6c 61 67 20 3d 20 62 43 6f 6e 63 75   exFlag = bConcu
1d4c0 72 72 65 6e 74 20 3f 20 2d 31 20 3a 20 28 77 72  rrent ? -1 : (wr
1d4d0 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
1d4e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d4f0 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
1d500 67 65 72 2c 20 65 78 46 6c 61 67 2c 20 73 71 6c  ger, exFlag, sql
1d510 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
1d520 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
1d530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d550 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1d560 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1d570 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1d580 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
1d590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d5a0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1d5b0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1d5c0 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
1d5d0 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
1d5e0 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
1d5f0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d600 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
1d610 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
1d620 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
1d630 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1d640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1d650 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1d660 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1d670 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1d680 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
1d690 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1d6a0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
1d6b0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
1d6c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d6d0 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
1d6e0 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
1d6f0 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
1d700 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
1d710 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
1d720 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
1d730 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
1d740 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
1d750 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
1d760 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1d770 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
1d780 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
1d790 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
1d7a0 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
1d7b0 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
1d7c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1d7d0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1d7e0 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
1d7f0 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
1d800 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
1d810 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
1d820 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1d830 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
1d840 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1d850 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
1d860 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
1d870 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
1d880 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
1d890 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1d8a0 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
1d8b0 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
1d8c0 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
1d8d0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
1d8e0 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
1d8f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d900 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
1d910 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
1d920 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
1d930 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
1d940 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
1d950 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
1d960 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
1d970 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
1d980 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
1d990 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
1d9a0 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
1d9b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1d9c0 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
1d9d0 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
1d9e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1d9f0 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
1da00 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
1da10 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
1da20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
1da30 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1da40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
1da50 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1da60 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
1da70 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1da80 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
1da90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1daa0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1dab0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1dac0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1dad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dae0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1daf0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1db00 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1db10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1db20 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e      }.  }...tran
1db30 73 5f 62 65 67 75 6e 3a 0a 23 69 66 6e 64 65 66  s_begun:.#ifndef
1db40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
1db50 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 62 43  CURRENT.  if( bC
1db60 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 72 63 3d  oncurrent && rc=
1db70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
1db80 6c 69 74 65 33 50 61 67 65 72 49 73 57 61 6c 28  lite3PagerIsWal(
1db90 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1dba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dbb0 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72  PagerBeginConcur
1dbc0 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rent(pBt->pPager
1dbd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1dbe0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1dbf0 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ag ){.      rc =
1dc00 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f   btreePtrmapAllo
1dc10 63 61 74 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  cate(pBt);.    }
1dc20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1dc30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dc40 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1dc50 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1dc60 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1dc70 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1dc80 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1dc90 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
1dca0 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1dcb0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1dcc0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1dcd0 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
1dce0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1dcf0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1dd00 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1dd10 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1dd20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1dd30 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   nSavepoint = p-
1dd40 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  >db->nSavepoint;
1dd50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dd60 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1dd70 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1dd80 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   nSavepoint);.  
1dd90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dda0 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70 6f 69 6e  _OK && nSavepoin
1ddb0 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
1ddc0 62 74 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e  btreePtrmapBegin
1ddd0 28 70 42 74 2c 20 6e 53 61 76 65 70 6f 69 6e 74  (pBt, nSavepoint
1dde0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1ddf0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1de00 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1de10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1de20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1de30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1de40 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
1de50 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
1de60 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
1de70 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
1de80 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
1de90 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
1dea0 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
1deb0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1dec0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
1ded0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
1dee0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
1def0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1df00 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
1df10 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
1df20 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
1df30 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1df40 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df60 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
1df70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
1df80 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1df90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dfa0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
1dfb0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
1dfc0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1dff0 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
1e000 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1e010 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  Bt;.  Pgno pgno 
1e020 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1e030 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e040 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1e050 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1e060 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d  );.  rc = pPage-
1e070 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45  >isInit ? SQLITE
1e080 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50  _OK : btreeInitP
1e090 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
1e0a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e0b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1e0c0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1e0d0 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
1e0e0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1e0f0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1e100 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1e110 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
1e120 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
1e130 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
1e140 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1e150 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
1e160 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1e170 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
1e180 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1e190 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1e1a0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1e1b0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
1e1c0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
1e1d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1e1e0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1e1f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1e200 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1e210 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1e220 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1e230 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1e240 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1e250 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1e260 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1e270 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
1e280 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1e290 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
1e2a0 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
1e2b0 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
1e2c0 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
1e2d0 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
1e2e0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
1e2f0 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
1e300 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
1e310 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
1e320 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
1e330 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
1e340 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1e350 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1e360 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
1e390 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1e3a0 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
1e3b0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1e3c0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1e3d0 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
1e3e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e3f0 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
1e400 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
1e410 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
1e420 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1e430 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
1e440 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1e450 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1e460 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
1e470 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
1e480 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
1e490 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1e4a0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1e4b0 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
1e4c0 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
1e4d0 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
1e4e0 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
1e4f0 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
1e500 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e510 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1e520 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1e530 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1e540 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
1e550 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
1e560 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1e570 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
1e580 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
1e590 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
1e5a0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
1e5b0 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
1e5c0 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
1e5d0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
1e5e0 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
1e5f0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
1e600 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e610 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
1e620 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  no);.    }.    p
1e630 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
1e640 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
1e650 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
1e660 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
1e670 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
1e680 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  rc = pPage->isIn
1e690 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  it ? SQLITE_OK :
1e6a0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1e6b0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e6c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e6d0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
1e6e0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
1e6f0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1e700 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
1e710 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1e720 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
1e730 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1e740 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
1e750 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
1e760 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
1e770 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
1e780 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
1e790 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
1e7a0 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
1e7b0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
1e7c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1e7d0 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cell+info.nSize 
1e7e0 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
1e7f0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
1e800 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
1e810 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e820 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
1e830 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1e840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e850 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
1e860 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  et4byte(pCell+in
1e870 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20  fo.nSize-4) ){. 
1e880 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1e890 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1e8a0 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20  Size-4, iTo);.  
1e8b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1e8c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1e8e0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1e8f0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
1e900 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1e910 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1e920 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
1e930 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e940 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e950 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
1e960 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
1e970 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1e980 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
1e990 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
1e9a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1e9b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1e9c0 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1e9d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e9e0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
1e9f0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
1ea00 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1ea10 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1ea20 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1ea30 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
1ea40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ea50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1ea60 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
1ea70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
1ea80 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
1ea90 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
1eaa0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
1eab0 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
1eac0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
1ead0 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
1eae0 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
1eaf0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1eb00 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
1eb10 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
1eb20 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
1eb30 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
1eb40 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
1eb50 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1eb60 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
1eb70 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
1eb80 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
1eb90 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
1eba0 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
1ebb0 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
1ebc0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
1ebd0 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
1ebe0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1ebf0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
1ec00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
1ec10 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
1ec20 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
1ec30 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ec50 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
1ec60 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
1ec70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1ec80 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
1ec90 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1eca0 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
1ecb0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1ecc0 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
1ecd0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
1ece0 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
1ecf0 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
1ed00 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1ed10 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
1ed20 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
1ed30 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1ed40 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
1ed50 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
1ed60 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
1ed70 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
1ed80 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
1ed90 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
1eda0 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
1edb0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
1edc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1edd0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
1ede0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1edf0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1ee00 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
1ee10 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1ee20 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
1ee30 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1ee40 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1ee50 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
1ee60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ee70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1ee80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1ee90 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
1eea0 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
1eeb0 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
1eec0 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
1eed0 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
1eee0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
1eef0 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
1ef00 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
1ef10 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
1ef20 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
1ef30 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
1ef40 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
1ef50 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
1ef60 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
1ef70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1ef80 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
1ef90 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
1efa0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1efb0 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
1efc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1efd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1efe0 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
1eff0 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
1f000 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
1f010 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
1f020 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
1f030 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
1f040 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
1f050 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
1f060 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1f070 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
1f080 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1f090 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
1f0a0 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
1f0b0 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
1f0c0 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
1f0d0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f0e0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
1f0f0 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
1f100 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
1f110 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
1f120 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1f130 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
1f140 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
1f150 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1f160 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1f170 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
1f180 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1f190 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1f1a0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1f1b0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1f1c0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1f1d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
1f1e0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
1f1f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f200 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f210 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f220 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1f230 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
1f240 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
1f250 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1f260 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
1f270 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1f280 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
1f290 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
1f2a0 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
1f2b0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
1f2c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f2d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f2e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1f2f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
1f300 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
1f310 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
1f320 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
1f330 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
1f340 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
1f350 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
1f360 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
1f370 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1f380 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
1f390 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1f3a0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
1f3b0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1f3c0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1f3d0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
1f3e0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
1f3f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1f410 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1f420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f430 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
1f440 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1f450 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f460 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
1f470 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1f480 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f490 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1f4a0 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
1f4b0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
1f4c0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1f4d0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
1f4e0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1f4f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f510 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1f520 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
1f530 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1f540 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1f550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f560 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1f570 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
1f580 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
1f590 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
1f5a0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1f5b0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
1f5c0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
1f5d0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
1f5e0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
1f5f0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
1f600 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
1f610 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
1f620 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
1f630 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
1f640 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
1f650 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
1f660 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
1f670 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
1f680 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
1f690 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1f6a0 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
1f6b0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
1f6c0 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
1f6d0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
1f6e0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
1f6f0 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
1f700 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
1f710 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
1f720 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
1f730 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
1f740 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
1f750 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
1f760 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
1f770 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
1f780 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
1f790 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1f7a0 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
1f7b0 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
1f7c0 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
1f7d0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
1f7e0 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
1f7f0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
1f800 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
1f810 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
1f820 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
1f830 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
1f840 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
1f850 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
1f860 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
1f870 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
1f880 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1f890 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
1f8a0 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
1f8b0 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
1f8c0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1f8d0 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
1f8e0 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
1f8f0 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
1f900 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
1f910 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1f920 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
1f930 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1f940 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
1f950 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
1f960 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
1f970 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1f980 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1f990 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
1f9a0 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
1f9b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1f9c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1f9d0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1f9e0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
1f9f0 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
1fa00 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
1fa10 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
1fa20 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
1fa30 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1fa40 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
1fa50 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
1fa60 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
1fa70 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
1fa80 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1fa90 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
1faa0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
1fab0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1fac0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1fad0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
1fae0 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
1faf0 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
1fb00 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1fb10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fb20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1fb30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fb40 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1fb50 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
1fb60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1fb70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1fb80 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
1fb90 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1fba0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
1fbb0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1fbc0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
1fbd0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1fbe0 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
1fbf0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
1fc00 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
1fc10 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
1fc20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
1fc30 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
1fc40 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
1fc50 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
1fc60 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
1fc70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1fc80 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
1fc90 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
1fca0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
1fcb0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
1fcc0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
1fcd0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1fce0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
1fcf0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
1fd00 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1fd10 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1fd20 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1fd30 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1fd40 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
1fd50 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
1fd60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1fd70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fd80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1fd90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fda0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1fdb0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
1fdc0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1fdd0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1fde0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
1fdf0 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
1fe00 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
1fe10 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
1fe20 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
1fe30 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
1fe40 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
1fe50 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
1fe60 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1fe70 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
1fe80 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1fe90 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1fea0 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
1feb0 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
1fec0 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
1fed0 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1fee0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1fef0 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
1ff00 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1ff10 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
1ff20 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
1ff30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ff40 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ff50 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
1ff60 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
1ff70 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
1ff80 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
1ff90 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
1ffa0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
1ffb0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
1ffc0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
1ffd0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
1ffe0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
1fff0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20000 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
20010 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
20020 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
20030 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
20040 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
20050 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
20060 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
20070 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
20080 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
20090 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
200a0 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
200b0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
200c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
200d0 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
200e0 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
200f0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
20100 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
20110 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
20120 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
20130 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
20140 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
20150 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
20160 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
20170 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20190 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
201a0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
201b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
201c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
201d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
201e0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
201f0 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
20200 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
20210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
20220 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
20230 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
20240 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
20250 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
20260 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
20270 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
20280 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
20290 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
202a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
202b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
202c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
202d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
202e0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
202f0 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
20300 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
20310 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
20320 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
20330 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
20340 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
20350 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
20360 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
20370 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
20380 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
20390 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
203a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
203b0 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
203c0 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
203d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
203e0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
203f0 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
20400 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
20410 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
20420 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
20430 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
20440 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
20450 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
20460 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
20470 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
20480 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
20490 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
204a0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
204b0 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
204c0 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
204d0 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
204e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
204f0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
20500 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
20510 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
20520 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
20530 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20540 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
20550 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
20560 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
20590 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
205a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
205b0 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
205c0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
205d0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
205e0 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
205f0 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
20600 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
20610 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
20620 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
20630 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
20640 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
20650 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
20660 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
20670 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
20680 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
20690 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
206a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
206b0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
206c0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
206d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
206e0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
206f0 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
20700 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
20710 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
20720 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
20730 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
20740 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
20750 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
20760 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
20770 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
20780 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
20790 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
207a0 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
207b0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
207c0 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
207d0 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
207e0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
207f0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
20800 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
20810 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
20820 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
20830 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20840 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
20850 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
20860 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20870 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
20880 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
208a0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
208b0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
208c0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
208d0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
208e0 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
208f0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
20900 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
20910 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
20920 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
20930 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
20940 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
20950 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
20960 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
20970 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
20980 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
20990 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
209a0 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
209b0 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
209c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
209d0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
209e0 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
209f0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
20a00 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
20a10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
20a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20a30 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
20a40 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
20a50 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
20a60 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
20a70 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
20a80 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
20a90 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
20aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20ab0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20ac0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
20ad0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
20ae0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
20af0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
20b00 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
20b10 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
20b20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
20b30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
20b40 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
20b50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
20b60 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
20b70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
20b80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
20b90 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
20ba0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
20bb0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
20bc0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
20bd0 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
20be0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
20bf0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
20c00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
20c10 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
20c20 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
20c30 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
20c40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20c50 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
20c60 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
20c70 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
20c80 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
20c90 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
20ca0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
20cb0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
20cc0 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
20cd0 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
20ce0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20cf0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
20d00 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
20d10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20d20 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
20d30 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
20d40 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
20d50 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
20d60 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
20d70 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20  nt(pPager); ).. 
20d80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20d90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
20da0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
20db0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
20dc0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
20dd0 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
20de0 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
20df0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
20e00 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
20e10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
20e20 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
20e30 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
20e40 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
20e50 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
20e60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20e70 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
20e80 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
20e90 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
20ea0 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
20eb0 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
20ec0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
20ed0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
20ee0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
20ef0 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
20f00 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
20f10 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
20f20 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
20f30 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
20f40 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
20f50 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
20f60 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
20f70 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
20f80 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
20f90 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
20fa0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
20fb0 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
20fc0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
20fd0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
20fe0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
20ff0 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
21000 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
21010 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
21020 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
21030 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
21040 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21050 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21060 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
21070 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
21080 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
21090 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
210a0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
210b0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
210c0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
210d0 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
210e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
210f0 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
21100 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
21110 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
21120 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
21130 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
21140 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
21150 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
21160 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
21170 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
21180 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
21190 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
211a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
211b0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
211c0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
211d0 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
211e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
211f0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
21200 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
21210 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
21220 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
21230 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
21240 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
21250 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
21260 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
21270 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
21280 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
21290 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
212a0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
212b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
212c0 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
212d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
212e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
212f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21300 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
21310 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
21320 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
21330 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
21340 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
21350 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
21360 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
21370 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21380 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
21390 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
213a0 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
213b0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
213c0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
213d0 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ENT./*.** This f
213e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
213f0 64 20 61 73 20 70 61 72 74 20 6f 66 20 6d 65 72  d as part of mer
21400 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52 45  ging an CONCURRE
21410 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  NT transaction w
21420 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73  ith.** the snaps
21430 68 6f 74 20 61 74 20 74 68 65 20 68 65 61 64 20  hot at the head 
21440 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e  of the wal file.
21450 20 49 74 20 72 65 6c 6f 63 61 74 65 73 20 61 6c   It relocates al
21460 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a  l pages in the.*
21470 2a 20 72 61 6e 67 65 20 69 46 69 72 73 74 2e 2e  * range iFirst..
21480 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65  iLast, inclusive
21490 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
214a0 74 68 61 74 20 74 68 65 20 42 74 72 65 65 50 74  that the BtreePt
214b0 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75 63 74 75  rmap .** structu
214c0 72 65 20 61 74 20 42 74 53 68 61 72 65 64 2e 70  re at BtShared.p
214d0 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Map contains the
214e0 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
214f0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 61 63   pointers to eac
21500 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65  h.** page in the
21510 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
21520 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 4e 55   pnCurrent is NU
21530 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  LL, then all pag
21540 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  es in the range 
21550 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 63 75 72  are moved to cur
21560 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c  rently.** free l
21570 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66  ocations (i.e. f
21580 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73  ree-list entries
21590 29 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74  ) within the dat
215a0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
215b0 65 20 70 61 67 65 0a 2a 2a 20 69 46 69 72 73 74  e page.** iFirst
215c0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70  ..**.** Or, if p
215d0 6e 43 75 72 72 65 6e 74 20 69 73 20 6e 6f 74 20  nCurrent is not 
215e0 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f  NULL, then it po
215f0 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 75 65 20  ints to a value 
21600 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
21610 2a 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * current size o
21620 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21630 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 6e  ile in pages. In
21640 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20   this case, all 
21650 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c  pages are.** rel
21660 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20 65 6e  ocated to the en
21670 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
21680 65 20 66 69 6c 65 20 2d 20 70 61 67 65 20 69 46  e file - page iF
21690 69 72 73 74 20 69 73 20 72 65 6c 6f 63 61 74 65  irst is relocate
216a0 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70  d to.** page (*p
216b0 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20 70 61 67  nCurrent+1), pag
216c0 65 20 69 46 69 72 73 74 2b 31 20 74 6f 20 70 61  e iFirst+1 to pa
216d0 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32  ge (*pnCurrent+2
216e0 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a  ), and so on..**
216f0 20 56 61 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e   Value *pnCurren
21700 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
21710 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
21720 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
21730 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
21740 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
21750 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
21760 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
21770 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
21780 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
21790 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
217a0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
217b0 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a 20  RelocateRange(. 
217c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217e0 20 2f 2a 20 42 2d 74 72 65 65 20 68 61 6e 64 6c   /* B-tree handl
217f0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72  e */.  Pgno iFir
21800 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
21810 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
21820 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65  page to relocate
21830 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74   */.  Pgno iLast
21840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21850 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
21860 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a  ge to relocate *
21870 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72  /.  Pgno *pnCurr
21880 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ent             
21890 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
218a0 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61  LL, IN/OUT: Data
218b0 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  base size */.){.
218c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
218d0 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72  E_OK;.  BtreePtr
218e0 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d  map *pMap = pBt-
218f0 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50  >pMap;.  Pgno iP
21900 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69 46  g;..  for(iPg=iF
21910 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74  irst; iPg<=iLast
21920 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
21930 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d  K; iPg++){.    M
21940 65 6d 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20  emPage *pFree = 
21950 30 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 61  0;     /* Page a
21960 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 66 72  llocated from fr
21970 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d  ee-list */.    M
21980 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
21990 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20  .    Pgno iNew; 
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
219b0 4e 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  New page number 
219c0 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 20 20 50  for pPg */.    P
219d0 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
219e0 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ry;    /* Pointe
219f0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
21a00 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20  page iPg */..   
21a10 20 69 66 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e   if( iPg==PENDIN
21a20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21a30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21a40 20 70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d   pEntry = &pMap-
21a50 3e 61 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70  >aPtr[iPg - pMap
21a60 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20  ->iFirst];..    
21a70 69 66 28 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  if( pEntry->eTyp
21a80 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
21a90 47 45 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  GE ){.      Pgno
21aa0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63   dummy;.      rc
21ab0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
21ac0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
21ad0 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42  , &dummy, iPg, B
21ae0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
21af0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21b00 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 61  (pFree);.      a
21b10 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21b20 45 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69  E_OK || dummy==i
21b30 50 67 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Pg );.    }else 
21b40 69 66 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b  if( pnCurrent ){
21b50 0a 20 20 20 20 20 20 62 74 72 65 65 47 65 74 50  .      btreeGetP
21b60 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70  age(pBt, iPg, &p
21b70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  Pg, 0);.      as
21b80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
21b90 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
21ba0 67 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  g->pDbPage) );. 
21bb0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
21bc0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
21bd0 63 6f 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61  count(pPg->pDbPa
21be0 67 65 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ge)==1 );.      
21bf0 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72  iNew = ++(*pnCur
21c00 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rent);.      if(
21c10 20 69 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42   iNew==PENDING_B
21c20 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
21c30 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72  iNew = ++(*pnCur
21c40 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  rent);.      rc 
21c50 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
21c60 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d  Bt, pPg, pEntry-
21c70 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e  >eType, pEntry->
21c80 70 61 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29  parent, iNew, 1)
21c90 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
21ca0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  ageNotNull(pPg);
21cb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21cc0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
21cd0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
21ce0 46 72 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69  Free, &iNew, iFi
21cf0 72 73 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c  rst-1, BTALLOC_L
21d00 45 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  E);.      assert
21d10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21d20 7c 7c 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29  || iNew<iFirst )
21d30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21d50 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
21d60 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  g = 0;.        r
21d70 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
21d80 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  );.        btree
21d90 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 67  GetPage(pBt, iPg
21da0 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
21db0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
21dc0 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c 20  ePage(pBt, pPg, 
21dd0 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20 70  pEntry->eType, p
21de0 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69 4e  Entry->parent,iN
21df0 65 77 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ew,1);.        r
21e00 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
21e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21e30 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  }../* !defined(S
21e40 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
21e50 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68 65  RRENT).**.** The
21e60 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 70   b-tree handle p
21e70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
21e80 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  y argument is ab
21e90 6f 75 74 20 74 6f 20 63 6f 6d 6d 69 74 20 61 6e  out to commit an
21ea0 0a 2a 2a 20 43 4f 4e 43 55 52 52 45 4e 54 20 74  .** CONCURRENT t
21eb0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20 74  ransaction. At t
21ec0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 20  his point it is 
21ed0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
21ee0 74 68 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73 73  this is .** poss
21ef0 69 62 6c 65 20 2d 20 74 68 65 20 77 61 6c 20 57  ible - the wal W
21f00 52 49 54 45 52 20 6c 6f 63 6b 20 69 73 20 68 65  RITER lock is he
21f10 6c 64 20 61 6e 64 20 69 74 20 69 73 20 6b 6e 6f  ld and it is kno
21f20 77 6e 20 74 68 61 74 20 74 68 65 72 65 20 61 72  wn that there ar
21f30 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69 63  e .** no conflic
21f40 74 73 20 77 69 74 68 20 63 6f 6d 6d 69 74 74 65  ts with committe
21f50 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  d transactions..
21f60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
21f70 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 42  reeFixUnlocked(B
21f80 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
21f90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21fa0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
21fb0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
21fc0 67 65 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d 20  ge1;.  u8 *p1 = 
21fd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
21fe0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21ff0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
22000 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22010 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61 67  OK;..  /* If pag
22020 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
22030 61 73 65 20 69 73 20 6e 6f 74 20 77 72 69 74 61  ase is not writa
22040 62 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61 67  ble, then no pag
22050 65 73 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65  es were allocate
22060 64 0a 20 20 2a 2a 20 6f 72 20 66 72 65 65 64 20  d.  ** or freed 
22070 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  by this transact
22080 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
22090 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 68 61 6e  e no special han
220a0 64 6c 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 72  dling is .  ** r
220b0 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
220c0 73 65 2c 20 69 66 20 70 61 67 65 20 31 20 69 73  se, if page 1 is
220d0 20 64 69 72 74 79 2c 20 70 72 6f 63 65 65 64 2e   dirty, proceed.
220e0 20 20 2a 2f 0a 20 20 42 74 72 65 65 50 74 72 6d    */.  BtreePtrm
220f0 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
22100 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54 72  pMap;.  Pgno iTr
22110 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
22120 70 31 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f 20  p1[32]);.  Pgno 
22130 6e 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  nPage = btreePag
22140 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 75  ecount(pBt);.  u
22150 33 32 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  32 nFree = get4b
22160 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20  yte(&p1[36]);.. 
22170 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 4d   assert( pBt->pM
22180 61 70 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ap );.  rc = sql
22190 69 74 65 33 50 61 67 65 72 55 70 67 72 61 64 65  ite3PagerUpgrade
221a0 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72 2c  Snapshot(pPager,
221b0 20 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65   pPage1->pDbPage
221c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3d  );.  assert( p1=
221d0 3d 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  =pPage1->aData )
221e0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
221f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
22200 6e 6f 20 6e 48 50 61 67 65 20 3d 20 67 65 74 34  no nHPage = get4
22210 62 79 74 65 28 26 70 31 5b 32 38 5d 29 3b 0a 20  byte(&p1[28]);. 
22220 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 6e     Pgno nFin = n
22230 48 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 2f  HPage;         /
22240 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 61 66 74  * Size of db aft
22250 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  er transaction m
22260 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28  erge */..    if(
22270 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
22280 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
22290 3e 70 44 62 50 61 67 65 29 20 29 7b 0a 20 20 20  >pDbPage) ){.   
222a0 20 20 20 50 67 6e 6f 20 69 48 54 72 75 6e 6b 20     Pgno iHTrunk 
222b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 33  = get4byte(&p1[3
222c0 32 5d 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e  2]);.      u32 n
222d0 48 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  HFree = get4byte
222e0 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 20 20  (&p1[36]);..    
222f0 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
22300 68 65 61 64 20 64 61 74 61 62 61 73 65 20 66 72  head database fr
22310 65 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 65  ee list to the e
22320 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  nd of the curren
22330 74 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  t.      ** trans
22340 61 63 74 69 6f 6e 73 20 66 72 65 65 2d 6c 69 73  actions free-lis
22350 74 20 28 69 66 20 61 6e 79 29 2e 20 20 2a 2f 0a  t (if any).  */.
22360 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
22370 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
22380 75 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 2c  ut4byte(&p1[36],
22390 20 6e 48 46 72 65 65 20 2b 20 6e 46 72 65 65 29   nHFree + nFree)
223a0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
223b0 74 65 28 26 70 31 5b 33 32 5d 2c 20 69 54 72 75  te(&p1[32], iTru
223c0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  nk);.        whi
223d0 6c 65 28 20 69 54 72 75 6e 6b 20 29 7b 0a 20 20  le( iTrunk ){.  
223e0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
223f0 70 54 72 75 6e 6b 20 3d 20 73 71 6c 69 74 65 33  pTrunk = sqlite3
22400 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
22410 65 72 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20  er, iTrunk);.   
22420 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
22430 67 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 54  get4byte((u8*)pT
22440 72 75 6e 6b 2d 3e 70 44 61 74 61 29 3b 0a 20 20  runk->pData);.  
22450 20 20 20 20 20 20 20 20 69 66 28 20 69 54 72 75          if( iTru
22460 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nk==0 ){.       
22470 20 20 20 20 20 70 75 74 34 62 79 74 65 28 28 75       put4byte((u
22480 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61  8*)pTrunk->pData
22490 2c 20 69 48 54 72 75 6e 6b 29 3b 0a 20 20 20 20  , iHTrunk);.    
224a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
224b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
224c0 72 65 66 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20  ref(pTrunk);.   
224d0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a       };.      }.
224e0 0a 20 20 20 20 20 20 69 66 28 20 6e 48 50 61 67  .      if( nHPag
224f0 65 3c 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d  e<(pMap->iFirst-
22500 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
22510 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
22520 6e 73 69 73 74 65 64 20 6f 66 20 28 70 4d 61 70  nsisted of (pMap
22530 2d 3e 69 46 69 72 73 74 2d 31 29 20 70 61 67 65  ->iFirst-1) page
22540 73 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  s when the curre
22550 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  nt.        ** co
22560 6e 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63  ncurrent transac
22570 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
22580 20 41 6e 64 20 61 6e 20 63 6f 6e 63 75 72 72 65   And an concurre
22590 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  nt transaction m
225a0 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  ay.        ** no
225b0 74 20 62 65 20 65 78 65 63 75 74 65 64 20 6f 6e  t be executed on
225c0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
225d0 64 61 74 61 62 61 73 65 20 2d 20 73 6f 20 74 68  database - so th
225e0 65 20 64 62 20 73 68 6f 75 6c 64 20 0a 20 20 20  e db should .   
225f0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65       ** not have
22600 20 73 68 72 75 6e 6b 20 73 69 6e 63 65 20 74 68   shrunk since th
22610 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
22620 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 72 65 66  s opened. Theref
22630 6f 72 65 20 6e 48 50 61 67 65 0a 20 20 20 20 20  ore nHPage.     
22640 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
22650 73 65 74 20 74 6f 20 28 70 4d 61 70 2d 3e 69 46  set to (pMap->iF
22660 69 72 73 74 2d 31 29 20 6f 72 20 67 72 65 61 74  irst-1) or great
22670 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  er. */.        r
22680 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22690 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
226a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
226b0 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   The current tra
226c0 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  nsaction allocat
226d0 65 64 20 70 61 67 65 73 20 70 4d 61 70 2d 3e 69  ed pages pMap->i
226e0 46 69 72 73 74 20 74 68 72 6f 75 67 68 0a 20 20  First through.  
226f0 20 20 20 20 20 20 2a 2a 20 6e 50 61 67 65 20 28        ** nPage (
22700 69 6e 63 6c 75 73 69 76 65 29 20 61 74 20 74 68  inclusive) at th
22710 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
22720 61 62 61 73 65 20 66 69 6c 65 2e 20 4d 65 61 6e  abase file. Mean
22730 77 68 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a  while,.        *
22740 2a 20 6f 74 68 65 72 20 74 72 61 6e 73 61 63 74  * other transact
22750 69 6f 6e 73 20 68 61 76 65 20 61 6c 6c 6f 63 61  ions have alloca
22760 74 65 64 20 28 69 46 69 72 73 74 2e 2e 6e 48 50  ted (iFirst..nHP
22770 61 67 65 29 2e 20 53 6f 20 6d 6f 76 65 0a 20 20  age). So move.  
22780 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 28        ** pages (
22790 69 46 69 72 73 74 2e 2e 4d 49 4e 28 6e 50 61 67  iFirst..MIN(nPag
227a0 65 2c 6e 48 50 61 67 65 29 29 20 74 6f 20 28 4d  e,nHPage)) to (M
227b0 41 58 28 6e 50 61 67 65 2c 6e 48 50 61 67 65 29  AX(nPage,nHPage)
227c0 2b 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  +1).  */.       
227d0 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d 20 4d 49   Pgno iLast = MI
227e0 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29  N(nPage, nHPage)
227f0 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67  ;    /* Last pag
22800 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 20  e to move */.   
22810 20 20 20 20 20 50 67 6e 6f 20 6e 43 75 72 72 65       Pgno nCurre
22820 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
22830 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
22840 65 6e 74 20 73 69 7a 65 20 6f 66 20 64 62 20 2a  ent size of db *
22850 2f 0a 20 20 20 20 20 20 20 20 6e 43 75 72 72 65  /.        nCurre
22860 6e 74 20 3d 20 4d 41 58 28 6e 50 61 67 65 2c 20  nt = MAX(nPage, 
22870 6e 48 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  nHPage);.       
22880 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f 63   rc = btreeReloc
22890 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 70 4d  ateRange(pBt, pM
228a0 61 70 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61 73  ap->iFirst, iLas
228b0 74 2c 20 26 6e 43 75 72 72 65 6e 74 29 3b 0a 0a  t, &nCurrent);..
228c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
228d0 20 61 72 65 20 6e 6f 77 20 6e 6f 20 63 6f 6c 6c   are now no coll
228e0 69 73 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20  isions with the 
228f0 73 6e 61 70 73 68 6f 74 20 61 74 20 74 68 65 20  snapshot at the 
22900 68 65 61 64 20 6f 66 20 74 68 65 0a 20 20 20 20  head of the.    
22910 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
22920 66 69 6c 65 2e 20 53 6f 20 61 74 20 74 68 69 73  file. So at this
22930 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
22940 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 77  be possible to w
22950 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  rite.        ** 
22960 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22970 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 42 65 66  out to disk. Bef
22980 6f 72 65 20 64 6f 69 6e 67 20 73 6f 20 74 68 6f  ore doing so tho
22990 75 67 68 2c 20 61 74 74 65 6d 70 74 20 74 6f 0a  ugh, attempt to.
229a0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6c 6f 63          ** reloc
229b0 61 74 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ate some of the 
229c0 6e 65 77 20 70 61 67 65 73 20 74 6f 20 66 72 65  new pages to fre
229d0 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68  e locations with
229e0 69 6e 20 74 68 65 20 62 6f 64 79 0a 20 20 20 20  in the body.    
229f0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61      ** of the da
22a00 74 61 62 61 73 65 20 66 69 6c 65 20 28 69 2e 65  tabase file (i.e
22a10 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72  . free-list entr
22a20 69 65 73 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ies). */.       
22a30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22a50 61 73 73 65 72 74 28 20 6e 43 75 72 72 65 6e 74  assert( nCurrent
22a60 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
22a70 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
22a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
22a90 65 72 53 65 74 44 62 73 69 7a 65 28 70 42 74 2d  erSetDbsize(pBt-
22aa0 3e 70 50 61 67 65 72 2c 20 6e 43 75 72 72 65 6e  >pPager, nCurren
22ab0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 46  t);.          nF
22ac0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
22ad0 70 31 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20 20  p1[36]);.       
22ae0 20 20 20 6e 46 69 6e 20 3d 20 6e 43 75 72 72 65     nFin = nCurre
22af0 6e 74 2d 6e 46 72 65 65 3b 0a 20 20 20 20 20 20  nt-nFree;.      
22b00 20 20 20 20 69 66 28 20 6e 43 75 72 72 65 6e 74      if( nCurrent
22b10 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
22b20 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
22b30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
22b40 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
22b50 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
22b60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22b70 20 20 20 20 20 6e 46 69 6e 20 3d 20 4d 41 58 28       nFin = MAX(
22b80 6e 46 69 6e 2c 20 6e 48 50 61 67 65 29 3b 0a 20  nFin, nHPage);. 
22b90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
22ba0 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65  reeRelocateRange
22bb0 28 70 42 74 2c 20 6e 46 69 6e 2b 31 2c 20 6e 43  (pBt, nFin+1, nC
22bc0 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  urrent, 0);.    
22bd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
22be0 75 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d 2c  ut4byte(&p1[28],
22bf0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   nFin);.      }.
22c00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22c10 33 50 61 67 65 72 53 65 74 44 62 73 69 7a 65 28  3PagerSetDbsize(
22c20 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20  pPager, nFin);. 
22c30 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
22c40 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
22c50 65 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b  e btreeFixUnlock
22c60 65 64 28 58 29 20 20 53 51 4c 49 54 45 5f 4f 4b  ed(X)  SQLITE_OK
22c70 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22c80 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
22c90 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T */../*.** This
22ca0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
22cb0 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
22cc0 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
22cd0 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
22ce0 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
22cf0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
22d00 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
22d10 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
22d20 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
22d30 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
22d40 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
22d50 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
22d60 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
22d70 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
22d80 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
22d90 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
22da0 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
22db0 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
22dc0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
22dd0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22de0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
22df0 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
22e00 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
22e10 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
22e20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
22e30 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
22e40 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
22e50 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
22e60 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
22e70 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
22e80 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
22e90 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
22ea0 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
22eb0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
22ec0 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
22ed0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
22ee0 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
22ef0 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
22f00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22f10 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
22f20 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
22f30 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
22f40 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
22f50 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
22f60 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
22f70 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
22f80 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
22f90 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
22fa0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
22fb0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
22fc0 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
22fd0 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
22fe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
22ff0 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
23000 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
23010 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
23020 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
23030 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
23040 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
23050 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
23060 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
23070 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
23080 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
23090 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
230a0 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
230b0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
230c0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
230d0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
230e0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
230f0 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
23100 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
23110 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
23120 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
23130 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
23140 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
23150 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
23160 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
23170 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
23180 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
23190 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
231a0 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
231b0 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
231c0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
231d0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
231e0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
231f0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
23200 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
23210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
23220 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
23230 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
23240 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
23250 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
23260 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
23270 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
23280 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23290 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  p);..#ifndef SQL
232a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
232b0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
232c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
232d0 20 20 20 20 20 61 73 73 65 72 74 28 20 49 53 43       assert( ISC
232e0 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20 29 3b 0a  ONCURRENT==0 );.
232f0 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
23300 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
23310 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
23320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23330 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
23340 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
23350 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23360 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23370 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  if( pBt->bDoTrun
23380 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  cate ){.      sq
23390 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
233a0 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
233b0 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ger, pBt->nPage)
233c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
233d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
233e0 45 5f 4f 4b 20 26 26 20 49 53 43 4f 4e 43 55 52  E_OK && ISCONCUR
233f0 52 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63  RENT ){.      rc
23400 20 3d 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63   = btreeFixUnloc
23410 6b 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ked(p);.    }.  
23420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
23440 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
23450 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
23460 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
23470 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
23480 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
23490 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
234a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
234b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
234c0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
234d0 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
234e0 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
234f0 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
23500 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
23510 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
23520 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
23530 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
23540 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
23550 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
23560 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
23570 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
23580 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
23590 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
235a0 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64  tex(p) );..#ifnd
235b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
235c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d  UTOVACUUM.  pBt-
235d0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30  >bDoTruncate = 0
235e0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
235f0 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
23600 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62  NONE && db->nVdb
23610 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f  eRead>1 ){.    /
23620 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
23630 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74  ther active stat
23640 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f  ements that belo
23650 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ng to this datab
23660 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c  ase.    ** handl
23670 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  e, downgrade to 
23680 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
23690 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68  saction. The oth
236a0 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20  er statements.  
236b0 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62    ** may still b
236c0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
236d0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  he database.  */
236e0 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
236f0 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
23700 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
23710 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
23720 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
23730 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
23740 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
23750 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
23760 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
23770 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
23780 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
23790 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
237a0 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
237b0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
237c0 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
237d0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
237e0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
237f0 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
23800 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
23810 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
23820 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
23830 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
23840 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
23850 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
23860 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
23870 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
23880 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
23890 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
238a0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
238b0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
238c0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
238d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
238e0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
238f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23900 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
23910 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
23920 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
23930 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
23940 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
23950 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
23960 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
23970 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
23980 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
23990 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
239a0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
239b0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
239c0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pBt);.  }..  /* 
239d0 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 43  If this was an C
239e0 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
239f0 63 74 69 6f 6e 2c 20 64 65 6c 65 74 65 20 74 68  ction, delete th
23a00 65 20 70 42 74 2d 3e 70 4d 61 70 20 6f 62 6a 65  e pBt->pMap obje
23a10 63 74 2e 0a 20 20 2a 2a 20 41 6c 73 6f 20 63 61  ct..  ** Also ca
23a20 6c 6c 20 50 61 67 65 72 45 6e 64 43 6f 6e 63 75  ll PagerEndConcu
23a30 72 72 65 6e 74 28 29 20 74 6f 20 65 6e 73 75 72  rrent() to ensur
23a40 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
23a50 20 68 61 73 20 64 69 73 63 61 72 64 65 64 0a 20   has discarded. 
23a60 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 20 6f   ** the record o
23a70 66 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 64  f all pages read
23a80 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
23a90 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 62  saction.  */.  b
23aa0 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65  treePtrmapDelete
23ab0 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  (pBt);.  sqlite3
23ac0 50 61 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65  PagerEndConcurre
23ad0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
23ae0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
23af0 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
23b00 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
23b10 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
23b20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
23b30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23b40 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
23b50 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
23b60 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
23b70 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
23b80 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
23b90 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
23ba0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
23bb0 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
23bc0 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
23bd0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
23be0 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
23bf0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
23c00 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
23c10 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
23c20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
23c30 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
23c40 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
23c50 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
23c60 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
23c70 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
23c80 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
23c90 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
23ca0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
23cb0 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
23cc0 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
23cd0 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
23ce0 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
23cf0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
23d00 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
23d10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
23d20 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
23d30 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
23d40 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
23d50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
23d60 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
23d70 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
23d80 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
23d90 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
23da0 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
23db0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
23dc0 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
23dd0 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
23de0 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
23df0 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
23e00 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
23e10 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
23e20 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
23e30 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
23e40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
23e50 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
23e60 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
23e70 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
23e80 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
23e90 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
23ea0 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
23eb0 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
23ec0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
23ed0 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
23ee0 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
23ef0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
23f00 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
23f10 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
23f20 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
23f30 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
23f40 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
23f50 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
23f60 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
23f70 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
23f80 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
23f90 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
23fa0 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
23fb0 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
23fc0 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
23fd0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
23fe0 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
23ff0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
24000 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
24010 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
24020 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24030 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
24040 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
24050 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
24060 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
24070 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
24080 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
24090 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
240a0 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
240b0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
240c0 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
240d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
240e0 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
240f0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
24100 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
24110 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
24120 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
24130 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
24140 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
24150 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
24160 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
24170 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
24180 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
24190 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
241a0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
241b0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
241c0 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
241d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
241e0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
241f0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
24200 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
24210 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
24220 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
24230 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
24240 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
24250 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
24260 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
24270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
24280 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
24290 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
242a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
242b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
242c0 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65  }.    p->iDataVe
242d0 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d  rsion--;  /* Com
242e0 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67  pensate for pPag
242f0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
24300 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  ++; */.    pBt->
24310 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
24320 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
24330 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
24340 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
24350 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
24360 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
24370 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
24380 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
24390 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
243a0 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
243b0 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
243c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
243d0 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
243e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
243f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
24400 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24410 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
24420 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
24430 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24440 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
24450 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
24460 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
24470 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
24480 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
24490 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
244a0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
244b0 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
244c0 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
244d0 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
244e0 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
244f0 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
24500 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61  any BtShared tha
24510 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
24520 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74  rences.  Or if t
24530 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
24540 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74  g is set to 1, t
24550 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70  hen only.** trip
24560 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
24570 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75  nd leave read cu
24580 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e  rsors unchanged.
24590 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
245a0 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  sor is a candida
245b0 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64  te to be tripped
245c0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
245d0 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f  ors.** that belo
245e0 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ng to other data
245f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
24600 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
24610 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68  be.** sharing th
24620 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
24630 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
24640 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
24650 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
24660 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ack occurs. If t
24670 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20  he writeOnly.** 
24680 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
24690 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75  en only write-cu
246a0 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72  rsors need be tr
246b0 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c  ipped - read-onl
246c0 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76  y.** cursors sav
246d0 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20  e their current 
246e0 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61  positions so tha
246f0 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69  t they may conti
24700 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  nue .** followin
24710 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  g the rollback. 
24720 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  Or, if writeOnly
24730 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63   is false, all c
24740 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74  ursors are .** t
24750 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72  ripped. In gener
24760 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73  al, writeOnly is
24770 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72   false if the tr
24780 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a  ansaction being.
24790 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d  ** rolled back m
247a0 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
247b0 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20  base schema. In 
247c0 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65  this case b-tree
247d0 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d   root.** pages m
247e0 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64  ay be moved or d
247f0 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
24800 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74  database altoget
24810 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69  her, making.** i
24820 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61  t unsafe for rea
24830 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e  d cursors to con
24840 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tinue..**.** If 
24850 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
24860 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61  ag is true and a
24870 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
24880 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a  ntered while .**
24890 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72   saving the curr
248a0 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
248b0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
248c0 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c  or, all cursors,
248d0 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61   .** including a
248e0 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20  ll read-cursors 
248f0 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a  are tripped..**.
24900 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
24910 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
24920 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e  essful, or if an
24930 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
24940 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20  ile.** saving a 
24950 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c  cursor position,
24960 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
24970 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
24980 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
24990 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
249a0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
249b0 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
249c0 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
249d0 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  *p;.  int rc = S
249e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
249f0 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d  ert( (writeOnly=
24a00 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =0 || writeOnly=
24a10 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74  =1) && BTCF_Writ
24a20 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  eFlag==1 );.  if
24a30 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
24a40 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24a50 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66  r(pBtree);.    f
24a60 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
24a70 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
24a80 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
24a90 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
24aa0 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28  ( writeOnly && (
24ab0 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
24ac0 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
24ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
24ae0 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
24af0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
24b00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
24b10 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
24b20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
24b30 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
24b40 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
24b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24b60 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
24b70 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
24b80 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
24b90 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
24ba0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
24bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24bc0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
24bd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24be0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
24bf0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
24c00 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24c10 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
24c20 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
24c30 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
24c40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
24c50 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
24c60 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
24c70 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
24c80 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
24c90 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
24ca0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
24cb0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
24cc0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
24cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24ce0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
24cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
24d00 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
24d10 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
24d20 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65  ot SQLITE_OK the
24d30 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  n cursors will b
24d40 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74  e invalidated (t
24d50 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79  ripped)..** Only
24d60 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
24d70 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72  re tripped if wr
24d80 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20  iteOnly is true 
24d90 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  but all cursors 
24da0 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69  are.** tripped i
24db0 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
24dc0 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d  alse.  Any attem
24dd0 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74  pt to use.** a t
24de0 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69  ripped cursor wi
24df0 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
24e00 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
24e10 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
24e20 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
24e30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24e40 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
24e50 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
24e60 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
24e70 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
24e80 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
24e90 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
24ea0 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
24eb0 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20  t tripCode, int 
24ec0 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e  writeOnly){.  in
24ed0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
24ee0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
24ef0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24f00 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72  1;..  assert( wr
24f10 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72  iteOnly==1 || wr
24f20 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  iteOnly==0 );.  
24f30 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65  assert( tripCode
24f40 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  ==SQLITE_ABORT_R
24f50 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43  OLLBACK || tripC
24f60 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
24f70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
24f80 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
24f90 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
24fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
24fb0 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
24fc0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
24fd0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24fe0 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30   ) writeOnly = 0
24ff0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
25000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25010 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
25020 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  e ){.    int rc2
25030 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54   = sqlite3BtreeT
25040 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
25050 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65   tripCode, write
25060 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72  Only);.    asser
25070 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
25080 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d   || (writeOnly==
25090 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45  0 && rc2==SQLITE
250a0 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _OK) );.    if( 
250b0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
250c0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20   rc = rc2;.  }. 
250d0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
250e0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
250f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
25100 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
25110 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
25120 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
25130 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
25140 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
25150 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
25160 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
25170 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
25180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25190 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
251a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
251b0 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
251c0 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
251d0 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
251e0 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
251f0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
25200 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
25210 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
25220 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
25230 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
25240 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
25250 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
25260 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
25270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25280 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
25290 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
252a0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
252b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
252c0 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
252d0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
252e0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
252f0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
25300 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
25310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
25320 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
25330 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
25340 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
25350 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
25360 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
25370 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
25380 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
25390 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
253a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
253b0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
253c0 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
253d0 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
253e0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
253f0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
25400 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
25410 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
25420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
25430 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
25440 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
25450 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
25460 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
25470 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
25480 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
25490 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
254a0 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
254b0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
254c0 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
254d0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
254e0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
254f0 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
25500 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
25510 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
25520 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
25530 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
25540 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
25550 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
25560 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
25570 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
25580 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
25590 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
255a0 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
255b0 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
255c0 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
255d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
255e0 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
255f0 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
25600 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
25610 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
25620 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
25630 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
25640 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
25650 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
25660 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
25670 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
25680 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
25690 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
256a0 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
256b0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
256c0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
256d0 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
256e0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
256f0 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
25700 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
25710 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
25720 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
25730 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
25740 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
25750 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
25760 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
25770 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
25780 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
25790 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
257a0 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
257b0 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
257c0 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
257d0 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
257e0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
257f0 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
25800 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
25810 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
25820 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
25830 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
25840 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
25850 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
25860 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
25870 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
25880 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
25890 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
258a0 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
258b0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
258c0 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
258d0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
258e0 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
258f0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
25900 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
25910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
25920 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
25930 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
25940 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
25950 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
25960 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
25970 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
25980 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
25990 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
259a0 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
259b0 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
259c0 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
259d0 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
259e0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
259f0 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
25a00 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
25a10 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
25a20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
25a30 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
25a40 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
25a50 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
25a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
25a70 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
25a80 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
25a90 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nt);.  if( rc==S
25aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25ab0 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  rc = btreePtrmap
25ac0 42 65 67 69 6e 28 70 42 74 2c 20 69 53 74 61 74  Begin(pBt, iStat
25ad0 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ement);.  }.  sq
25ae0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
25af0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
25b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
25b10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
25b20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
25b30 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
25b40 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
25b50 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
25b60 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
25b70 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
25b80 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
25b90 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
25ba0 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
25bb0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
25bc0 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
25bd0 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
25be0 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
25bf0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
25c00 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
25c10 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
25c20 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
25c30 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
25c40 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
25c50 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
25c60 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
25c70 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
25c80 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
25c90 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
25ca0 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
25cb0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
25cc0 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
25cd0 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
25ce0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
25cf0 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
25d00 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
25d10 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
25d20 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
25d30 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
25d40 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
25d50 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
25d60 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
25d70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25d80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
25d90 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
25da0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
25db0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
25dc0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
25dd0 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
25de0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
25df0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
25e00 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
25e10 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
25e20 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
25e30 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
25e40 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
25e50 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
25e60 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
25e70 20 20 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e     btreePtrmapEn
25e80 64 28 70 42 74 2c 20 6f 70 2c 20 69 53 61 76 65  d(pBt, op, iSave
25e90 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  point);.    if( 
25ea0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
25eb0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
25ec0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
25ed0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
25ee0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
25ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25f00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25f10 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
25f20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
25f30 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
25f40 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
25f50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25f60 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
25f70 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
25f80 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
25f90 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
25fa0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
25fb0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
25fc0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
25fd0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
25fe0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
25ff0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
26000 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
26010 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
26020 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
26030 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
26040 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
26050 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
26060 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
26070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
26080 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
26090 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
260a0 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
260b0 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
260c0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
260d0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
260e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
260f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
26100 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26110 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
26120 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
26130 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
26140 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
26150 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
26160 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
26170 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
26180 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
26190 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
261a0 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
261b0 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
261c0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
261d0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
261e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
261f0 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
26200 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
26210 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
26220 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
26230 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
26240 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
26250 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
26260 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
26270 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69   bit of wrFlag i
26280 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68  s clear, then th
26290 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
262a0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72  y.** be used for
262b0 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68   reading.  If th
262c0 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
262d0 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  t is set, then t
262e0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
262f0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
26300 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74  ding or for writ
26310 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
26320 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
26330 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ing.** are also 
26340 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20  met.  These are 
26350 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
26360 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
26370 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20  in order.** for 
26380 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c  writing to be al
26390 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
263a0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
263b0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
263c0 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f  d with wrFlag co
263d0 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57  ntaining BTREE_W
263e0 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  RCSR.**.** 2:  O
263f0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
26400 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
26410 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
26420 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
26430 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
26440 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
26450 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
26460 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
26470 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
26480 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
26490 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
264a0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
264b0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
264c0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
264d0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
264e0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
264f0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
26500 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
26510 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
26520 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
26530 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
26540 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
26550 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
26560 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
26570 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
26580 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
26590 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
265a0 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c  The BTREE_FORDEL
265b0 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61  ETE bit of wrFla
265c0 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  g may optionally
265d0 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45   be set if BTREE
265e0 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74  _WRCSR.** is set
265f0 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20  .  If FORDELETE 
26600 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20  is set, that is 
26610 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
26620 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
26630 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72  t.** this cursor
26640 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
26650 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e  ed to seek to an
26660 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73  d delete entries
26670 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
26680 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72  as part of a lar
26690 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65  ger DELETE state
266a0 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45  ment.  The FORDE
266b0 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74  LETE hint is not
266c0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
266d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
266e0 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74    But in a hypot
266f0 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74  hetical alternat
26700 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69  ive storage engi
26710 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ne .** in which 
26720 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72  index entries ar
26730 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
26740 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72  deleted when cor
26750 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
26760 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c  .** rows are del
26770 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c  eted, the FORDEL
26780 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69  ETE flag is a hi
26790 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b  nt that all SEEK
267a0 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f   and DELETE.** o
267b0 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69  perations on thi
267c0 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  s cursor can be 
267d0 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52  no-ops and all R
267e0 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63  EAD operations c
267f0 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  an .** return a 
26800 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65  null row (2-byte
26810 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a  s: 0x01 0x00)..*
26820 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
26830 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
26840 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
26850 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
26860 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
26870 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
26880 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
26890 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
268a0 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
268b0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
268c0 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
268d0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
268e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
268f0 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
26900 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
26910 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
26920 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
26930 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
26940 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
26950 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26960 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
26970 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26990 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
269a0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
269b0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
269c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269d0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
269e0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
269f0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
26a20 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
26a30 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
26a40 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
26a50 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
26a60 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
26a70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
26a80 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
26a90 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ab0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
26ac0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
26ad0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
26ae0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
26af0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
26b00 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
26b10 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
26b20 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
26b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26b40 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
26b50 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
26b60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
26b70 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
26b80 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
26b90 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20  t( wrFlag==0 .  
26ba0 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
26bb0 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20  BTREE_WRCSR .   
26bc0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28      || wrFlag==(
26bd0 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45  BTREE_WRCSR|BTRE
26be0 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20  E_FORDELETE) .  
26bf0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
26c00 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
26c10 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
26c20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
26c30 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
26c40 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
26c50 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
26c60 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
26c70 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
26c80 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
26c90 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
26ca0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
26cb0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
26cc0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
26cd0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
26ce0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26cf0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
26d00 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
26d10 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
26d20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b  (wrFlag?2:1)) );
26d30 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
26d40 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
26d50 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
26d60 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
26d70 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
26d80 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
26d90 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
26da0 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
26db0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
26dc0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
26dd0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
26de0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
26df0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
26e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
26e10 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
26e20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
26e30 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
26e40 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74  g==0 || (pBt->bt
26e50 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
26e60 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20  D_ONLY)==0 );.. 
26e70 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
26e80 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
26e90 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
26ea0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
26eb0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
26ec0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
26ed0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
26ee0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
26ef0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
26f00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
26f10 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
26f20 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
26f30 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
26f40 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
26f50 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
26f60 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
26f70 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
26f80 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
26f90 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
26fa0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
26fb0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
26fc0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
26fd0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
26fe0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
26ff0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
27000 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
27010 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
27020 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
27030 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
27040 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
27050 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
27060 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
27070 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
27080 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
27090 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
270a0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
270b0 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
270c0 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
270d0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
270e0 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
270f0 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
27100 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
27110 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
27120 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
27130 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
27140 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
27150 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
27160 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
27170 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
27180 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
27190 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
271a0 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
271b0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
271c0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
271d0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
271e0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
271f0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
27200 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
27210 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
27220 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
27230 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
27240 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
27250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
27280 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
272b0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
272c0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
272d0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
272e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27300 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
27310 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
27320 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
27330 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
27340 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
27350 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
27360 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
27370 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27390 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
273a0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
273b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
273c0 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
273d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
273e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
273f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
27400 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
27410 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
27420 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
27430 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
27440 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
27450 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
27460 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
27470 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
27480 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
27490 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
274a0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
274b0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
274c0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
274d0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
274e0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
274f0 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
27500 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
27510 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
27520 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
27530 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
27540 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
27550 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
27560 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
27570 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
27580 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
27590 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
275a0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
275b0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
275c0 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
275d0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
275e0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
275f0 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
27600 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
27610 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
27620 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
27630 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
27640 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
27650 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
27660 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
27670 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
27680 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
27690 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
276a0 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
276b0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
276c0 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
276d0 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
276e0 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
276f0 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
27700 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
27710 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
27720 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
27730 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
27740 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
27750 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
27760 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
27770 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
27780 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
27790 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
277a0 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
277b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
277c0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
277d0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
277e0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
277f0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
27800 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
27810 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
27820 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
27830 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
27840 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
27850 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
27860 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
27870 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
27880 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
27890 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
278a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
278b0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
278c0 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Cur);.    assert
278d0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d  ( pBt->pCursor!=
278e0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  0 );.    if( pBt
278f0 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20  ->pCursor==pCur 
27900 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  ){.      pBt->pC
27910 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
27920 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
27930 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a        BtCursor *
27940 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75  pPrev = pBt->pCu
27950 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a  rsor;.      do{.
27960 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
27970 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29  v->pNext==pCur )
27980 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  {.          pPre
27990 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
279a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
279b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
279c0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
279d0 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b   = pPrev->pNext;
279e0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41  .      }while( A
279f0 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a  LWAYS(pPrev) );.
27a00 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
27a10 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
27a20 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
27a30 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
27a40 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
27a50 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
27a60 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
27a70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27a80 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
27a90 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
27aa0 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
27ab0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
27ac0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
27ad0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
27ae0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
27af0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
27b00 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
27b10 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
27b20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
27b30 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
27b40 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
27b50 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
27b60 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
27b70 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
27b80 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
27b90 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
27ba0 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
27bb0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
27bc0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
27bd0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
27be0 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
27bf0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
27c00 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
27c10 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
27c20 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
27c30 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
27c40 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
27c50 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
27c60 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
27c70 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
27c80 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
27c90 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
27ca0 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
27cb0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
27cc0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
27cd0 67 65 5d 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26  ge], pCur->ix, &
27ce0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
27cf0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
27d00 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
27d10 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
27d20 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
27d30 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
27d40 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
27d50 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
27d60 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
27d70 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
27d80 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
27d90 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
27da0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
27db0 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
27dc0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
27dd0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
27de0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
27df0 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
27e00 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
27e10 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
27e20 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66  r->ix,&pCur->inf
27e30 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
27e40 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
27e50 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  pCur);.  }.}..#i
27e60 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
27e70 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
27e80 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
27e90 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
27ea0 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
27eb0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
27ec0 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
27ed0 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
27ee0 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
27ef0 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
27f00 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
27f10 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
27f20 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
27f30 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
27f40 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
27f50 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
27f60 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
27f70 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
27f80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27f90 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
27fa0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
27fb0 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
27fc0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27fd0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
27fe0 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
27ff0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
28000 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e  eeCursorIsValidN
28010 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  N(BtCursor *pCur
28020 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ){.  assert( pCu
28030 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
28040 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28050 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a  URSOR_VALID;.}..
28060 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
28070 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
28080 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f  teger key or "ro
28090 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65  wid" for a table
280a0 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20   btree..** This 
280b0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
280c0 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73  valid for a curs
280d0 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74  or that is point
280e0 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72  ing into a.** or
280f0 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72  dinary table btr
28100 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ee.  If the curs
28110 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  or points to an 
28120 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a  index btree or.*
28130 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68  * is invalid, th
28140 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73  e result of this
28150 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65   routine is unde
28160 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71  fined..*/.i64 sq
28170 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
28180 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  rKey(BtCursor *p
28190 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
281a0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
281b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
281c0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
281d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
281e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
281f0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
28200 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
28210 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
28220 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a  r->info.nKey;.}.
28230 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28240 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
28250 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72  s of payload for
28260 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
28270 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65  pCur is.** curre
28280 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
28290 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72  .  For table btr
282a0 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
282b0 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  e the amount.** 
282c0 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e  of data.  For in
282d0 64 65 78 20 62 74 72 65 65 73 2c 20 74 68 69 73  dex btrees, this
282e0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a   will be the siz
282f0 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  e of the key..**
28300 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
28310 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
28320 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
28330 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
28340 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
28350 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
28360 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
28370 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
28380 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
28390 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
283a0 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
283b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
283c0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
283d0 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
283e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
283f0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
28400 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
28410 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28420 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28430 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
28440 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
28450 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
28460 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
28470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
28480 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
28490 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
284a0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
284b0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
284c0 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
284d0 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
284e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
284f0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
28500 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
28510 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
28520 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
28530 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
28540 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
28550 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
28560 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
28570 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
28580 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
28590 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
285a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
285b0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
285c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
285d0 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
285e0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
285f0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
28600 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
28610 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
28620 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
28630 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
28640 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
28650 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
28660 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
28670 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
28680 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
28690 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
286a0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
286b0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
286c0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
286d0 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
286e0 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
286f0 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
28700 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
28710 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
28720 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
28730 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
28740 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
28750 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
28760 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
28770 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
28780 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
28790 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
287a0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
287b0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
287c0 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
287d0 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
287e0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
287f0 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
28800 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
28810 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
28820 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
28830 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
28840 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
28850 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
28860 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
28870 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
28880 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
28890 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
288a0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
288b0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
288c0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
288d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
288e0 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
288f0 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
28900 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
28910 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
28920 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
28930 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
28940 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
28950 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
28960 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
28970 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28980 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
28990 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
289a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
289b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
289c0 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
289d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
289e0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
289f0 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
28a00 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
28a10 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
28a20 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
28a30 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
28a40 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
28a50 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
28a60 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
28a70 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
28a80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
28a90 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
28aa0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
28ab0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
28ac0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
28ad0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
28ae0 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
28af0 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
28b00 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
28b10 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
28b20 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
28b30 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
28b40 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
28b50 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
28b60 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
28b70 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
28b80 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
28b90 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
28ba0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
28bb0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
28bc0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
28bd0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
28be0 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
28bf0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
28c00 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
28c10 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
28c20 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
28c30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28c40 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
28c50 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
28c60 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
28c70 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
28c80 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
28c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
28ca0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
28cb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
28cc0 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
28cd0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
28ce0 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
28cf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28d00 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
28d10 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
28d20 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
28d30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
28d40 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
28d50 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
28d60 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
28d70 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
28d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28d90 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
28da0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
28db0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
28dc0 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
28dd0 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
28de0 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
28df0 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
28e00 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
28e10 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
28e20 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
28e30 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
28e40 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
28e50 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
28e60 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
28e70 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
28e80 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
28e90 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
28ea0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
28eb0 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
28ec0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
28ed0 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
28ee0 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
28ef0 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
28f00 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
28f10 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
28f20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
28f30 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
28f40 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
28f50 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
28f60 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
28f70 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
28f80 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
28f90 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
28fa0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
28fb0 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
28fc0 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
28fd0 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
28fe0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
28ff0 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
29000 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
29010 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
29020 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
29030 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
29040 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
29050 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
29060 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
29070 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
29080 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
29090 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
290a0 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
290b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
290c0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
290d0 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
29100 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
29110 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
29120 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
29130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
29140 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
29150 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
29160 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
29170 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
29180 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
29190 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
291a0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
291b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
291c0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
291d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
291e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
291f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
29200 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
29210 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
29220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
29230 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
29240 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
29250 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
29260 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
29270 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
29280 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
29290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
292a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
292b0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
292c0 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
292d0 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
292e0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
292f0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
29300 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
29310 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
29320 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
29330 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
29340 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
29350 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
29360 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
29370 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
29380 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
29390 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
293a0 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
293b0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
293c0 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a  rflow cache..**.
293d0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
293e0 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
293f0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
29400 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
29410 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
29420 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
29430 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
29440 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
29450 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  nt being read or
29460 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61   written might a
29470 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
29480 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20  n page.** or be 
29490 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
294a0 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
294b0 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ow pages..**.** 
294c0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  If the current c
294d0 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
294e0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
294f0 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74  rflow pages.** t
29500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
29510 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
29520 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70  for and lazily p
29530 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f  opulate.** the o
29540 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
29550 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
29560 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
29570 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
29580 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
29590 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
295a0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
295b0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
295c0 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
295d0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
295e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
295f0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
29600 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
29610 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
29620 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
29630 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
29640 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
29650 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
29660 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
29670 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
29680 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
29690 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
296a0 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
296b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
296c0 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
296d0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
296e0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
296f0 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
29700 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
29710 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
29720 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
29730 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
29740 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
29750 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
29760 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
29770 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
29780 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
29790 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
297a0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
297b0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
297c0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
297d0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
297e0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
297f0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
29800 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
29810 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
29820 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
29830 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
29840 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
29850 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
29860 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
29870 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
29880 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
29890 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
298a0 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
298b0 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
298c0 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
298d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
298e0 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
298f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29900 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
29910 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
29920 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
29930 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
29940 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
29950 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
29960 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
29970 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29990 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
299a0 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
299b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
299c0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
299d0 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  AD.  unsigned ch
299e0 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53  ar * const pBufS
299f0 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20  tart = pBuf;    
29a00 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69   /* Start of ori
29a10 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72  ginal out buffer
29a20 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
29a30 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
29a40 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20   assert( eOp==0 
29a50 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61  || eOp==1 );.  a
29a60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29a70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29a80 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29a90 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e  Cur->ix<pPage->n
29aa0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
29ab0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
29ac0 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
29ad0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
29ae0 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
29af0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29b00 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66  ad;.  assert( of
29b10 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
29b20 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
29b30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50  );..  assert( aP
29b40 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e  ayload > pPage->
29b50 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28  aData );.  if( (
29b60 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d  uptr)(aPayload -
29b70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e   pPage->aData) >
29b80 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
29b90 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e - pCur->info.n
29ba0 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
29bb0 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
29bc0 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
29bd0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
29be0 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  a is an error.  
29bf0 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69  The.    ** condi
29c00 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20  tional above is 
29c10 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20  really:.    **  
29c20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72    &aPayload[pCur
29c30 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
29c40 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
29c50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
29c60 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65      ** but is re
29c70 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75  cast into its cu
29c80 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76  rrent form to av
29c90 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72  oid integer over
29ca0 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20  flow problems.  
29cb0 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
29cc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
29cd0 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
29ce0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
29cf0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
29d00 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
29d10 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
29d20 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
29d30 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
29d40 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
29d50 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
29d60 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
29d70 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
29d80 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
29d90 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
29da0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
29db0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
29dc0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
29dd0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
29de0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
29df0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
29e00 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
29e10 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
29e20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
29e30 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
29e40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
29e50 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
29e60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29e70 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
29e80 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
29e90 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
29ea0 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
29eb0 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
29ec0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
29ed0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
29ee0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
29ef0 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
29f00 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
29f10 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
29f20 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
29f30 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
29f40 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
29f50 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
29f60 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
29f70 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
29f80 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
29f90 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
29fa0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
29fb0 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
29fc0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
29fd0 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
29fe0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
29ff0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
2a000 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
2a010 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
2a020 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
2a030 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
2a040 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
2a050 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
2a060 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
2a070 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
2a080 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
2a090 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2a0a0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2a0b0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
2a0c0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
2a0d0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
2a0e0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
2a0f0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
2a100 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
2a110 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
2a120 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
2a130 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
2a140 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
2a150 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
2a160 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2a170 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
2a180 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
2a190 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2a1a0 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
2a1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2a1c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2a1d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
2a1e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
2a1f0 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
2a200 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20  = nOvfl*2;.     
2a210 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
2a220 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
2a230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2a240 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
2a250 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
2a260 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
2a270 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  o));.      pCur-
2a280 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2a290 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
2a2a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2a2b0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
2a2c0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
2a2d0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
2a2e0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
2a2f0 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
2a300 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
2a310 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
2a320 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
2a330 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
2a340 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   to it..      */
2a350 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2a360 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
2a370 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
2a380 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f         iIdx = (o
2a390 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
2a3a0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67  .        nextPag
2a3b0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
2a3c0 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
2a3d0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
2a3e0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
2a3f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2a400 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2a410 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
2a420 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   );.    while( n
2a430 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
2a440 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
2a450 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
2a460 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2a470 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
2a480 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2a490 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
2a4a0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2a4b0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
2a4c0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
2a4d0 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
2a4e0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
2a4f0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
2a500 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
2a510 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20  nextPage;..     
2a520 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
2a530 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
2a540 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
2a550 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
2a560 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
2a570 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
2a580 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
2a590 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
2a5a0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
2a5b0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
2a5c0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
2a5d0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
2a5e0 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
2a5f0 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
2a600 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
2a610 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
2a620 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
2a630 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
2a640 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
2a650 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
2a660 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
2a670 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a680 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2a690 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2a6a0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2a6b0 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
2a6c0 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
2a6d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
2a6e0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
2a6f0 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
2a700 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
2a710 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
2a720 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
2a730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2a740 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
2a750 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
2a760 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
2a770 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a780 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
2a790 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
2a7a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2a7b0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
2a7c0 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
2a7d0 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
2a7e0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
2a7f0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
2a800 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
2a810 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
2a820 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
2a830 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
2a840 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
2a850 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
2a860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a870 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
2a880 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69  /* File from whi
2a890 63 68 20 74 6f 20 64 6f 20 64 69 72 65 63 74 20  ch to do direct 
2a8a0 6f 76 65 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f  overflow read */
2a8b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2a8c0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
2a8d0 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
2a8e0 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
2a8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
2a900 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
2a910 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
2a920 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
2a930 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
2a940 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
2a950 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
2a960 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
2a970 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2a980 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
2a990 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
2a9a0 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
2a9b0 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
2a9c0 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
2a9d0 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
2a9e0 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
2a9f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
2aa00 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
2aa10 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
2aa20 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
2aa30 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74 61  **   4) the data
2aa40 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
2aa50 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
2aa60 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61 67   **   5) the pag
2aa70 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
2aa80 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  WAL file.       
2aa90 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73   **   6) at leas
2aaa0 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
2aab0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
2aac0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
2aad0 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
2aae0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
2aaf0 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
2ab00 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
2ab10 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2ab20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
2ab30 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
2ab40 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
2ab50 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
2ab60 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
2ab70 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
2ab80 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
2ab90 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
2aba0 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
2abb0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
2abc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2abd0 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20  f( eOp==0       
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac00 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
2ac10 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
2ac20 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
2ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac50 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
2ac60 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
2ac70 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
2ac80 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
2ac90 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a          /* (3) *
2aca0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
2acb0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
2acc0 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
2acd0 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
2ace0 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
2acf0 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
2ad00 33 50 61 67 65 72 55 73 65 57 61 6c 28 70 42 74  3PagerUseWal(pBt
2ad10 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
2ad20 67 65 29 20 20 20 20 20 20 20 2f 2a 20 28 35 29  ge)       /* (5)
2ad30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
2ad40 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
2ad50 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad70 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
2ad80 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2ad90 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
2ada0 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
2adb0 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
2adc0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2add0 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
2ade0 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae00 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f  /* due to (6) */
2ae10 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2ae20 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c  y(aSave, aWrite,
2ae30 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   4);.          r
2ae40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2ae50 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b  d(fd, aWrite, a+
2ae60 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67  4, (i64)pBt->pag
2ae70 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d  eSize*(nextPage-
2ae80 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  1));.          n
2ae90 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
2aea0 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20  te(aWrite);.    
2aeb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72        memcpy(aWr
2aec0 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a  ite, aSave, 4);.
2aed0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
2aee0 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a  ndif..        {.
2aef0 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
2af00 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
2af10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2af20 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
2af30 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
2af40 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
2af50 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30           (eOp==0
2af60 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
2af70 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
2af80 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2af90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2afa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2afb0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
2afc0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
2afd0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
2afe0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
2aff0 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
2b000 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
2b010 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
2b020 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
2b030 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
2b040 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
2b050 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2b060 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2b070 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2b080 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
2b090 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2b0b0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
2b0c0 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65   if( amt==0 ) re
2b0d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2b0e0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
2b0f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2b100 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2b110 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  iIdx++;.    }.  
2b120 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
2b130 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
2b140 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c  ){.    /* Overfl
2b150 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72  ow chain ends pr
2b160 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20  ematurely */.   
2b170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b180 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
2b190 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  e->pgno);.  }.  
2b1a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b1b0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
2b1c0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
2b1d0 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
2b1e0 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
2b1f0 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
2b200 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
2b210 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
2b220 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
2b230 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
2b240 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
2b250 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
2b260 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
2b270 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
2b280 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
2b290 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
2b2a0 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
2b2b0 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
2b2c0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
2b2d0 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
2b2e0 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
2b2f0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
2b300 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
2b310 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
2b320 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
2b330 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
2b340 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
2b350 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
2b360 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
2b370 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
2b380 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
2b390 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
2b3a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
2b3b0 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
2b3c0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
2b3d0 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
2b3e0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
2b3f0 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
2b400 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
2b410 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
2b420 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
2b430 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
2b440 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
2b450 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
2b460 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2b470 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
2b480 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
2b490 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
2b4a0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
2b4b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
2b4c0 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
2b4d0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
2b4e0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
2b4f0 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
2b500 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2b510 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2b520 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2b530 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2b540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b550 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
2b560 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b570 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
2b580 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2b590 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b5a0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
2b5b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
2b5c0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2b5d0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
2b5e0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
2b5f0 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
2b600 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20  This variant of 
2b610 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
2b620 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e  oad() works even
2b630 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
2b640 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  as not.** in the
2b650 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74   CURSOR_VALID st
2b660 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ate.  It is only
2b670 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
2b680 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
2b690 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
2b6a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2b6b0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73  _OMIT_INCRBLOB.s
2b6c0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2b6d0 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73  NLINE int access
2b6e0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a  PayloadChecked(.
2b6f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2b700 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a  ,.  u32 offset,.
2b710 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69    u32 amt,.  voi
2b720 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  d *pBuf.){.  int
2b730 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72   rc;.  if ( pCur
2b740 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2b750 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
2b760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
2b770 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ORT;.  }.  asser
2b780 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2b790 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2b7a0 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
2b7b0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2b7c0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
2b7d0 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73   rc ? rc : acces
2b7e0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
2b7f0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
2b800 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
2b810 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
2b820 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20  hecked(BtCursor 
2b830 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
2b840 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
2b850 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70   *pBuf){.  if( p
2b860 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b870 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2b880 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2b890 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2b8a0 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
2b8b0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2b8c0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
2b8d0 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c   pBuf, 0);.  }el
2b8e0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  se{.    return a
2b8f0 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
2b900 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  ked(pCur, offset
2b910 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20  , amt, pBuf);.  
2b920 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
2b930 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
2b940 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OB */../*.** Ret
2b950 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2b960 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
2b970 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
2b980 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
2b990 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
2b9a0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
2b9b0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
2b9c0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2b9d0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
2b9e0 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
2b9f0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
2ba00 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
2ba10 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
2ba20 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
2ba30 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
2ba40 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
2ba50 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
2ba60 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
2ba70 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
2ba80 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
2ba90 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
2baa0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
2bab0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
2bac0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2bad0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
2bae0 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
2baf0 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
2bb00 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
2bb10 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
2bb20 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
2bb30 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
2bb40 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
2bb50 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
2bb60 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
2bb70 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
2bb80 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
2bb90 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
2bba0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
2bbb0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
2bbc0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
2bbd0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
2bbe0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
2bbf0 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
2bc00 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
2bc10 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
2bc20 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
2bc30 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
2bc40 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
2bc50 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
2bc60 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
2bc70 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
2bc80 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
2bc90 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
2bca0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
2bcb0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
2bcc0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
2bcd0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
2bce0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
2bcf0 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
2bd00 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
2bd10 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
2bd20 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
2bd30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2bd40 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
2bd50 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
2bd60 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
2bd70 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
2bd80 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
2bd90 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
2bda0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
2bdb0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
2bdc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2bdd0 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
2bde0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
2bdf0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2be00 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
2be10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2be20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2be30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2be40 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2be50 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2be60 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2be70 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2be80 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2be90 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2bea0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2beb0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
2bec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2bed0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
2bee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2bef0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2bf00 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  >pCur->apPage[pC
2bf10 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
2bf20 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
2bf30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2bf40 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2bf50 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
2bf60 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
2bf70 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
2bf80 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74  B);.  amt = (int
2bf90 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  )(pCur->apPage[p
2bfa0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
2bfb0 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
2bfc0 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20  fo.pPayload);.  
2bfd0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2bfe0 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20  Local<amt ) amt 
2bff0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
2c000 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61  cal;.  *pAmt = a
2c010 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
2c020 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
2c030 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
2c040 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
2c050 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
2c060 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
2c070 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
2c080 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
2c090 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
2c0a0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
2c0b0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
2c0c0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
2c0d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
2c0e0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
2c0f0 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
2c100 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
2c110 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
2c120 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
2c130 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
2c140 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
2c150 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
2c160 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
2c170 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
2c180 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
2c190 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
2c1a0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
2c1b0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
2c1c0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
2c1d0 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
2c1e0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
2c1f0 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
2c200 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
2c210 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
2c220 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
2c230 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
2c240 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
2c250 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
2c260 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
2c270 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
2c280 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
2c290 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
2c2a0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
2c2b0 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
2c2c0 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
2c2d0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
2c2e0 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
2c2f0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2c300 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
2c310 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
2c320 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
2c330 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
2c340 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
2c350 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
2c360 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2c370 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2c380 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
2c390 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
2c3a0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
2c3b0 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
2c3c0 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
2c3d0 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
2c3e0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
2c3f0 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
2c400 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
2c410 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
2c420 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
2c430 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
2c440 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
2c450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2c460 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
2c470 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
2c480 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
2c490 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
2c4a0 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Bt;.  int rc;.. 
2c4b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2c4c0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2c4d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2c4e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2c4f0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2c500 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2c510 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
2c520 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
2c530 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
2c540 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2c550 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
2c560 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
2c570 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c580 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2c590 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
2c5a0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2c5b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c5c0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2c5d0 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2c5e0 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  l);.  pCur->aiId
2c5f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 5d  x[pCur->iPage++]
2c600 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70   = pCur->ix;.  p
2c610 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 72  Cur->ix = 0;.  r
2c620 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
2c630 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
2c640 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70   &pCur->apPage[p
2c650 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
2c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c670 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d       pCur, pCur-
2c680 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
2c690 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c6a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 65 74 4d  E_OK ){.    setM
2c6b0 65 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d  empageRoot(pCur-
2c6c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c6d0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  age], pCur->pgno
2c6e0 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Root);.  }.  ret
2c6f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
2c700 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2c710 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
2c720 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
2c730 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
2c740 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
2c750 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
2c760 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2c770 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2c780 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
2c790 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
2c7a0 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
2c7b0 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
2c7c0 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
2c7d0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
2c7e0 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
2c7f0 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
2c800 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
2c810 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
2c820 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
2c830 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2c840 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2c850 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2c860 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
2c870 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20   iChild){.  if( 
2c880 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
2c890 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e  urn;  /* The con
2c8a0 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62  ditions tested b
2c8b0 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62  elow might not b
2c8c0 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20  e true.         
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8e0 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
2c8f0 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  pt database */. 
2c900 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
2c910 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
2c920 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
2c930 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2c940 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2c950 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2c960 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2c970 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
2c980 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
2c990 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2c9a0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2c9b0 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
2c9c0 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
2c9d0 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
2c9e0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2c9f0 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
2ca00 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2ca10 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
2ca20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
2ca30 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
2ca40 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
2ca50 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
2ca60 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
2ca70 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
2ca80 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
2ca90 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
2caa0 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
2cab0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
2cac0 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
2cad0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
2cae0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
2caf0 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
2cb00 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
2cb10 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
2cb20 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
2cb30 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
2cb40 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2cb50 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2cb60 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2cb70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2cb80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cb90 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
2cba0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2cbb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2cbc0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
2cbd0 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
2cbe0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2cbf0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
2cc00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2cc10 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
2cc20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
2cc30 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
2cc40 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73  o.  );.  testcas
2cc50 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2cc60 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
2cc70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2cc80 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
2cc90 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ll );.  pCur->in
2cca0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2ccb0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2ccc0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2ccd0 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2cce0 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  l);.  pCur->ix =
2ccf0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2cd00 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 72  r->iPage-1];.  r
2cd10 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
2cd20 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
2cd30 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
2cd40 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2cd50 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
2cd60 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
2cd70 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
2cd80 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
2cd90 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
2cda0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
2cdb0 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
2cdc0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
2cdd0 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
2cde0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
2cdf0 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
2ce00 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2ce10 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
2ce20 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
2ce30 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
2ce40 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
2ce50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
2ce60 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
2ce70 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
2ce80 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2ce90 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
2cea0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
2ceb0 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
2cec0 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
2ced0 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
2cee0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
2cef0 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
2cf00 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
2cf10 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
2cf20 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
2cf30 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
2cf40 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
2cf50 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
2cf60 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
2cf70 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
2cf80 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
2cf90 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
2cfa0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
2cfb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2cfc0 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
2cfd0 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
2cfe0 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
2cff0 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
2d000 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
2d010 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
2d020 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
2d030 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
2d040 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
2d050 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
2d060 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
2d070 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
2d080 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
2d090 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
2d0a0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
2d0b0 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
2d0c0 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
2d0d0 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
2d0e0 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
2d0f0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
2d100 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
2d110 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
2d120 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
2d130 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
2d140 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
2d150 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
2d160 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
2d170 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
2d180 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2d190 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
2d1a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d1b0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2d1c0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d1d0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d1e0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
2d1f0 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
2d200 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
2d210 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
2d220 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
2d230 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
2d240 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2d250 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
2d260 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2d270 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d280 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
2d290 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
2d2a0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2d2b0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2d2c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d2d0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
2d2e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2d2f0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2d300 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
2d310 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
2d320 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
2d330 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
2d340 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
2d350 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2d360 67 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  ge ){.      do{.
2d370 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d380 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d390 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a  r->iPage]!=0 );.
2d3a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2d3b0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2d3c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d3d0 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 20 20 7d  age--]);.      }
2d3e0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61  while( pCur->iPa
2d3f0 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ge);.      goto 
2d400 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d  skip_init;.    }
2d410 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
2d420 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
2d430 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2d440 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2d450 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
2d460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2d470 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2d480 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31  pCur->iPage==(-1
2d490 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ) );.    rc = ge
2d4a0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
2d4b0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
2d4c0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2d4d0 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
2d4e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d4f0 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75            0, pCu
2d500 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2d510 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d530 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2d540 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2d550 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  .       return r
2d560 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  c;.    }.    set
2d570 4d 65 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72  MempageRoot(pCur
2d580 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 20 70 43 75  ->apPage[0], pCu
2d590 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  r->pgnoRoot);.  
2d5a0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
2d5b0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  0;.    pCur->cur
2d5c0 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61  IntKey = pCur->a
2d5d0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2d5e0 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
2d5f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2d600 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
2d610 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
2d620 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
2d630 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
2d640 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
2d650 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
2d660 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
2d670 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
2d680 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
2d690 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
2d6a0 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
2d6b0 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
2d6c0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
2d6d0 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
2d6e0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
2d6f0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
2d700 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
2d710 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
2d720 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
2d730 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
2d740 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
2d750 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
2d760 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
2d770 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
2d780 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
2d790 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
2d7a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2d7b0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
2d7c0 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
2d7d0 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
2d7e0 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
2d7f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2d800 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
2d810 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
2d820 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
2d830 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
2d840 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
2d850 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
2d860 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
2d870 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
2d880 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
2d890 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
2d8a0 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
2d8b0 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
2d8c0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2d8d0 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
2d8e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d8f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
2d900 4e 4f 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  NO(pCur->apPage[
2d910 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
2d920 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69  no);.  }..skip_i
2d930 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69  nit:  .  pCur->i
2d940 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
2d950 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2d960 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2d970 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
2d980 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  |BTCF_ValidNKey|
2d990 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2d9a0 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  ..  pRoot = pCur
2d9b0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 69  ->apPage[0];.  i
2d9c0 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e  f( pRoot->nCell>
2d9d0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
2d9e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2d9f0 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ALID;.  }else if
2da00 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  ( !pRoot->leaf )
2da10 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
2da20 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
2da30 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
2da40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2da50 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
2da60 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
2da70 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
2da80 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
2da90 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
2daa0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2dab0 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
2dac0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2dad0 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
2dae0 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
2daf0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2db00 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ALID;.  }.  retu
2db10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2db20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2db30 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
2db40 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2db50 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2db60 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
2db70 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2db80 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
2db90 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2dba0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
2dbb0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
2dbc0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
2dbd0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
2dbe0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2dbf0 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
2dc00 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2dc10 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2dc20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2dc30 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2dc40 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2dc50 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2dc60 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2dc70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dc80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2dc90 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2dca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2dcb0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
2dcc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2dcd0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
2dce0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2dcf0 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  ->ix<pPage->nCel
2dd00 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
2dd10 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2dd20 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2dd30 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  x));.    rc = mo
2dd40 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2dd50 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2dd60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2dd70 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2dd80 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
2dd90 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
2dda0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2ddb0 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
2ddc0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2ddd0 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
2dde0 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
2ddf0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
2de00 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
2de10 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2de20 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
2de30 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2de40 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
2de50 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2de60 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
2de70 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2de80 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
2de90 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
2dea0 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
2deb0 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
2dec0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
2ded0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2dee0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
2def0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
2df00 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2df10 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2df20 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
2df30 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2df40 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2df50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2df60 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2df70 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
2df80 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2df90 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2dfa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2dfb0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2dfc0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2dfd0 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
2dfe0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2dff0 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
2e000 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
2e010 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2e020 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2e030 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
2e040 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e  ur->ix = pPage->
2e050 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
2e060 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2e070 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
2e080 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2e090 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20  .  }.  pCur->ix 
2e0a0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2e0b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2e0c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2e0d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2e0e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2e0f0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
2e100 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2e110 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
2e120 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2e130 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
2e140 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2e150 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2e160 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
2e170 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
2e180 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2e190 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
2e1a0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
2e1b0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
2e1c0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2e1d0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2e1e0 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
2e1f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2e200 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2e210 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2e220 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2e230 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2e240 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e250 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2e260 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2e270 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
2e280 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2e290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
2e2b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2e2c0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
2e2d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2e2e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2e2f0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2e300 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2e310 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2e320 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
2e330 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2e340 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2e350 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2e360 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
2e370 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2e380 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
2e390 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
2e3a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e3b0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2e3c0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
2e3d0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2e3e0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2e3f0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2e400 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2e410 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2e420 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2e430 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2e440 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2e450 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2e460 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2e470 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2e480 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
2e490 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2e4a0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
2e4b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2e4c0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2e4d0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2e4e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2e4f0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2e500 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2e510 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
2e520 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
2e530 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
2e540 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
2e550 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
2e560 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2e570 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
2e580 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2e590 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
2e5a0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2e5b0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
2e5c0 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
2e5d0 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
2e5e0 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
2e5f0 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
2e600 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
2e610 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
2e620 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
2e630 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
2e640 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
2e650 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
2e660 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2e670 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
2e680 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
2e690 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
2e6a0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d  sert( pCur->ix==
2e6b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e6c0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2e6d0 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
2e6e0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2e6f0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
2e700 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
2e710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e720 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
2e730 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2e740 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e750 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
2e760 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2e770 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2e780 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2e790 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2e7a0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2e7b0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2e7c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2e7d0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
2e7e0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2e7f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2e800 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2e810 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2e820 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
2e830 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2e840 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
2e850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e860 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2e870 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
2e880 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Last;.      }els
2e890 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  e{.        pCur-
2e8a0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2e8b0 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
2e8c0 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d   }.   .    }.  }
2e8d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e8e0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2e8f0 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
2e900 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
2e910 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
2e920 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
2e930 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
2e940 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
2e950 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
2e960 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
2e970 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
2e980 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
2e990 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
2e9a0 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
2e9b0 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
2e9c0 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
2e9d0 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
2e9e0 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
2e9f0 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
2ea00 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
2ea10 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2ea20 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
2ea30 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2ea40 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
2ea50 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
2ea60 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
2ea70 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
2ea80 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
2ea90 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
2eaa0 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
2eab0 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
2eac0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
2ead0 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
2eae0 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
2eaf0 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
2eb00 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
2eb10 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
2eb20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
2eb30 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
2eb40 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
2eb50 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
2eb60 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
2eb70 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
2eb80 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2eb90 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
2eba0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2ebb0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2ebc0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2ebd0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2ebe0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
2ebf0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2ec00 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
2ec10 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
2ec20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2ec30 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
2ec40 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
2ec50 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
2ec60 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
2ec70 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
2ec80 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2ec90 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2eca0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2ecc0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
2ecd0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2ece0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
2ecf0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2ed00 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2ed10 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2ed20 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2ed30 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
2ed40 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2ed50 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  xKey..**.** For 
2ed60 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68  index tables, th
2ed70 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65  e pIdxKey->eqSee
2ed80 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74  n field is set t
2ed90 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  o 1 if there.** 
2eda0 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20  exists an entry 
2edb0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
2edc0 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  t exactly matche
2edd0 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a  s pIdxKey.  .*/.
2ede0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2edf0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
2ee00 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2ee10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
2ee20 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
2ee30 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
2ee40 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
2ee50 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
2ee60 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
2ee70 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
2ee80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
2ee90 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
2eea0 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
2eeb0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
2eec0 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
2eed0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
2eee0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
2eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef00 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
2ef10 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
2ef20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
2ef30 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
2ef40 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
2ef50 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2ef60 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2ef70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2ef80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ef90 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2efa0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
2efb0 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
2efc0 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
2efd0 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
2efe0 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20  eyInfo==0) );.  
2eff0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2f000 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2f010 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d  ID || (pIdxKey==
2f020 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e  0)==(pCur->curIn
2f030 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f  tKey!=0) );..  /
2f040 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2f050 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
2f060 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
2f070 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
2f080 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
2f090 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
2f0a0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
2f0b0 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
2f0c0 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20  f( pIdxKey==0.  
2f0d0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
2f0e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
2f0f0 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2f100 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2f110 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  ey)!=0.  ){.    
2f120 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2f130 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2f140 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2f150 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f160 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2f170 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2f180 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
2f190 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d        if( (pCur-
2f1a0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2f1b0 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20  _AtLast)!=0 ){. 
2f1c0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d         *pRes = -
2f1d0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2f1e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2f1f0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66     }.      /* If
2f200 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b   the requested k
2f210 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74  ey is one more t
2f220 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  han the previous
2f230 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20   key, then.     
2f240 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74   ** try to get t
2f250 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74  here using sqlit
2f260 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61  e3BtreeNext() ra
2f270 74 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c  ther than a full
2f280 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79  .      ** binary
2f290 20 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69   search.  This i
2f2a0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2f2b0 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72  n only.  The cor
2f2c0 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20  rect answer.    
2f2d0 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62    ** is still ob
2f2e0 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74  tained without t
2f2f0 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61  his case, only a
2f300 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f   little more slo
2f310 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  wely */.      if
2f320 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2f330 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21  y+1==intKey && !
2f340 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2f350 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2f360 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2f370 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
2f380 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  xt(pCur, 0);.   
2f390 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2f3a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f3b0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
2f3c0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pCur);.         
2f3d0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2f3e0 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2f3f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2f400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f420 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2f430 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
2f440 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2f450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2f460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2f480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
2f4a0 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78  pIdxKey ){.    x
2f4b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2f4c0 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
2f4d0 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b  ompare(pIdxKey);
2f4e0 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72  .    pIdxKey->er
2f4f0 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61  rCode = 0;.    a
2f500 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e  ssert( pIdxKey->
2f510 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20  default_rc==1 . 
2f520 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2f530 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2f540 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  0 .         || p
2f550 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2f560 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20  rc==-1.    );.  
2f570 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f  }else{.    xReco
2f580 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f  rdCompare = 0; /
2f590 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69  * All keys are i
2f5a0 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a  ntegers */.  }..
2f5b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2f5c0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2f5d0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2f5e0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2f5f0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2f600 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2f610 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2f620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2f630 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2f640 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2f650 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
2f660 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
2f670 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2f680 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
2f690 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2f6a0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2f6b0 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43  ll>0 );.  if( pC
2f6c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2f6d0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
2f6e0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2f6f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f700 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2f710 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2f720 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
2f730 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
2f740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2f750 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f760 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
2f770 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y==pCur->curIntK
2f780 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
2f790 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2f7a0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
2f7b0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
2f7c0 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
2f7d0 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
2f7e0 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
2f7f0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
2f800 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2f810 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
2f820 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2f830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f840 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2f850 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2f860 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2f870 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2f880 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2f890 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2f8a0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2f8b0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2f8c0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2f8d0 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2f8e0 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2f8f0 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2f900 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2f910 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2f920 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2f930 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2f940 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2f950 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2f960 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2f970 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2f980 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2f990 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2f9a0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2f9b0 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2f9c0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2f9d0 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2f9e0 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2f9f0 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2fa00 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2fa10 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2fa20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2fa30 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2fa40 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2fa50 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2fa60 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2fa70 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2fa80 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2fa90 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2faa0 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2fab0 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2fac0 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2fad0 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2fae0 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2faf0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2fb00 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2fb10 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2fb20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2fb30 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2fb40 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2fb50 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2fb60 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2fb70 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2fb80 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2fb90 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2fba0 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2fbb0 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2fbc0 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2fbe0 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2fbf0 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ataEnd ){.      
2fc00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2fc10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
2fc20 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
2fc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2fc40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fc50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
2fc60 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
2fc70 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
2fc80 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2fc90 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
2fca0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2fcb0 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
2fcc0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2fcd0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
2fce0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2fcf0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
2fd00 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
2fd10 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2fd20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2fd30 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
2fd40 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2fd50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2fd60 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
2fd70 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
2fd80 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2fd90 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2fda0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2fdb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2fdc0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2fdd0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2fde0 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2fdf0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2fe00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2fe10 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2fe20 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
2fe30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2fe40 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2fe50 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2fe60 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2fe70 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2fe80 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2fe90 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2fea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2feb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2fed0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2fee0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2fef0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2ff00 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2ff10 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
2ff20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2ff30 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2ff40 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
2ff50 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2ff60 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
2ff70 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
2ff80 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2ff90 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2ffa0 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2ffb0 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
2ffc0 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
2ffd0 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
2ffe0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
2fff0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
30000 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
30010 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
30020 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
30030 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
30040 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
30050 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
30060 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
30070 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
30080 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
30090 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
300a0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
300b0 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
300c0 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
300d0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
300e0 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
300f0 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
30100 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
30110 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
30120 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
30130 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
30140 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
30150 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
30160 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
30170 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
30180 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30190 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
301a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
301b0 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
301c0 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
301d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
301e0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
301f0 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
30200 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
30210 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
30220 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
30230 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
30240 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
30250 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
30260 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
30270 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
30280 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30290 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
302a0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
302b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
302c0 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
302d0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
302e0 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
302f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
30300 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
30310 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
30320 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
30330 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
30340 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
30350 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
30360 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
30370 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
30380 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
30390 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
303a0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
303b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
303c0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
303d0 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
303e0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
303f0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
30400 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
30410 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
30420 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
30430 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
30440 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
30450 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
30460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
30480 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
30490 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
304a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
304b0 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
304c0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
304d0 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
304e0 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
304f0 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
30500 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
30510 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
30520 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
30530 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
30540 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
30550 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
30560 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
30570 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
30580 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
30590 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
305a0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
305b0 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
305c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
305d0 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
305e0 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
305f0 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
30600 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30610 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
30620 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
30630 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
30640 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
30650 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
30660 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
30670 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
30680 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
30690 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
306a0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
306b0 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
306c0 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
306d0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
306e0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
306f0 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
30700 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
30710 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
30720 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
30730 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
30740 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
30750 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30760 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a   nCell<0 );   /*
30770 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a   True if key siz
30780 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72  e is 2^32 or mor
30790 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  e */.          t
307a0 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
307b0 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  0 );  /* Invalid
307c0 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
307d0 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20   0x80 0x00 */.  
307e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
307f0 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f  ( nCell==1 );  /
30800 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
30810 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
30820 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x01 */.         
30830 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
30840 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  ==2 );  /* Minim
30850 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b  um legal index k
30860 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ey size */.     
30870 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32       if( nCell<2
30880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30890 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
308a0 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
308b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
308c0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
308d0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
308e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
308f0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
30900 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20  alloc( nCell+18 
30910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30920 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
30930 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30940 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
30950 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
30960 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
30970 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
30980 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
30990 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
309a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
309b0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
309c0 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
309d0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
309e0 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
309f0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
30a00 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
30a10 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20  dOvfl;.         
30a20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
30a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
30a40 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
30a50 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
30a60 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
30a70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30a80 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
30a90 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
30aa0 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
30ab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
30ac0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
30ad0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
30ae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
30af0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
30b00 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
30b10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
30b20 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
30b30 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
30b40 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
30b50 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
30b60 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
30b70 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
30b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
30b90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
30ba0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
30bb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
30bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
30bd0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
30be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30bf0 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
30c00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
30c10 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
30c20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
30c30 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
30c40 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
30c50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30c60 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
30c70 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
30c80 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
30c90 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
30ca0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
30cb0 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
30cc0 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
30cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
30ce0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
30cf0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
30d00 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
30d10 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
30d20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30d30 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
30d40 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
30d50 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
30d60 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
30d70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
30d80 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
30d90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
30da0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
30db0 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50 61  r->ix<pCur->apPa
30dc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
30dd0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
30de0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
30df0 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
30e00 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
30e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30e20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
30e30 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
30e40 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
30e50 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
30e60 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
30e70 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
30e80 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
30e90 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
30ea0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
30eb0 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
30ec0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
30ed0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
30ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
30ef0 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b  ->ix = (u16)lwr;
30f00 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
30f10 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
30f20 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
30f30 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
30f40 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
30f50 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
30f60 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   0;.  assert( (p
30f70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
30f80 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
30f90 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
30fa0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
30fb0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
30fc0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
30fd0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
30fe0 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
30ff0 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
31000 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
31010 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
31020 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
31030 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
31040 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
31050 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
31060 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
31070 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
31080 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
31090 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
310a0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
310b0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
310c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
310d0 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
310e0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
310f0 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
31100 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
31110 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
31120 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
31130 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
31140 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
31150 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
31160 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
31170 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
31180 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
31190 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
311a0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
311b0 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
311c0 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
311d0 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
311e0 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65  turn an estimate
311f0 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20   for the number 
31200 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
31210 61 62 6c 65 20 74 68 61 74 20 70 43 75 72 20 69  able that pCur i
31220 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  s.** pointing to
31230 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
31240 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e  tive number if n
31250 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 75  o estimate is cu
31260 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69  rrently .** avai
31270 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71  lable..*/.i64 sq
31280 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75  lite3BtreeRowCou
31290 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a  ntEst(BtCursor *
312a0 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  pCur){.  i64 n;.
312b0 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72    u8 i;..  asser
312c0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
312d0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
312e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
312f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
31300 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
31310 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75  tex) );..  /* Cu
31320 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74  rrently this int
31330 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63  erface is only c
31340 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f  alled by the OP_
31350 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f  IfSmaller.  ** o
31360 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68  pcode, and it th
31370 61 74 20 63 61 73 65 20 74 68 65 20 63 75 72 73  at case the curs
31380 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  or will always b
31390 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a  e valid and.  **
313a0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69   will always poi
313b0 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64  nt to a leaf nod
313c0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
313d0 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  R(pCur->eState!=
313e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20  CURSOR_VALID) ) 
313f0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28  return -1;.  if(
31400 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 70 50   NEVER(pCur->apP
31410 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
31420 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74  ->leaf==0) ) ret
31430 75 72 6e 20 2d 31 3b 0a 0a 20 20 66 6f 72 28 6e  urn -1;..  for(n
31440 3d 31 2c 20 69 3d 30 3b 20 69 3c 3d 70 43 75 72  =1, i=0; i<=pCur
31450 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
31460 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70     n *= pCur->ap
31470 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a  Page[i]->nCell;.
31480 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
31490 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
314a0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
314b0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
314c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a   the database. .
314d0 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a  ** Return value:
314e0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  .**.**    SQLITE
314f0 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63 65  _OK        succe
31500 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ss.**    SQLITE_
31510 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72  DONE      cursor
31520 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
31530 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74  ting at the last
31540 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f   element.**    o
31550 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20 20  therwise        
31560 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
31570 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
31580 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
31590 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
315a0 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54  3BtreeNext().  T
315b0 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
315c0 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
315d0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
315e0 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d  of merely increm
315f0 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
31600 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
31610 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
31620 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68   next cell on th
31630 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
31640 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
31650 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72  reeNext() helper
31660 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
31670 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
31680 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
31690 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
316a0 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20  t page or.** to 
316b0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
316c0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74  or..**.** If bit
316d0 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61   0x01 of the F a
316e0 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74  rgument in sqlit
316f0 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46 29  e3BtreeNext(C,F)
31700 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 0a   is 1, then the.
31710 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73  ** cursor corres
31720 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
31730 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72  index and this r
31740 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
31750 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65  e been.** skippe
31760 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64  d if the SQL ind
31770 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e  ex had been a un
31780 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65  ique index.  The
31790 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69   F argument.** i
317a0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
317b0 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69  implement.  SQLi
317c0 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
317d0 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
317e0 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e   use.** this hin
317f0 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f  t, but COMDB2 do
31800 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  es..*/.static SQ
31810 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
31820 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75  t btreeNext(BtCu
31830 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
31840 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
31850 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
31860 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
31870 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
31880 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
31890 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
318a0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
318b0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
318c0 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
318d0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
318e0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
318f0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
31900 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
31910 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
31920 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
31930 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
31940 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
31950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31960 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31970 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
31980 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
31990 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
319a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
319b0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
319c0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
319d0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
319e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
319f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
31a00 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
31a10 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
31a20 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
31a30 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
31a40 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
31a50 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
31a60 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
31a70 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
31a80 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
31a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31aa0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
31ab0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
31ac0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
31ad0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
31ae0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
31af0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78  idx = ++pCur->ix
31b00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31b10 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
31b20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
31b30 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
31b40 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
31b50 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
31b60 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
31b70 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
31b80 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
31b90 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
31ba0 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
31bb0 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
31bc0 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
31bd0 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
31be0 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
31bf0 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
31c00 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
31c10 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
31c20 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
31c30 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
31c40 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
31c50 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
31c60 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
31c70 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
31c80 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
31c90 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
31ca0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
31cb0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
31cc0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
31cd0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
31ce0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
31cf0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
31d00 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
31d10 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
31d20 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31d30 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
31d40 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
31d50 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
31d60 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
31d70 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
31d80 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
31d90 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
31da0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
31db0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
31dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
31dd0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
31de0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
31df0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
31e00 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
31e10 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70  ile( pCur->ix>=p
31e20 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
31e30 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
31e40 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
31e50 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
31e60 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a  eNext(pCur, 0);.
31e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31e90 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
31ea0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
31eb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
31ec0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
31ed0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
31ee0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
31ef0 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
31f00 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
31f10 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
31f20 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61   flags){.  MemPa
31f30 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e 55  ge *pPage;.  UNU
31f40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66  SED_PARAMETER( f
31f50 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64  lags );  /* Used
31f60 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e   in COMDB2 but n
31f70 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65  ot native SQLite
31f80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 75   */.  assert( cu
31f90 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
31fa0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
31fb0 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
31fc0 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73  flags==1 );.  as
31fd0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
31fe0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
31ff0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
32000 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
32010 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
32020 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
32030 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
32040 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
32050 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75  Ovfl);.  if( pCu
32060 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
32070 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
32080 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29   btreeNext(pCur)
32090 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
320a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
320b0 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b  Page];.  if( (++
320c0 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65  pCur->ix)>=pPage
320d0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
320e0 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72  Cur->ix--;.    r
320f0 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
32100 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pCur);.  }.  if(
32110 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
32120 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32130 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
32140 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
32150 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
32160 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
32170 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
32180 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
32190 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
321a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
321b0 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73  ** Return values
321c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
321d0 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63 65 73  TE_OK     succes
321e0 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
321f0 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72 73 6f  DONE   the curso
32200 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20  r is already on 
32210 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
32220 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a  t of the table.*
32230 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 20  *     otherwise 
32240 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
32250 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
32260 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
32270 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
32280 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
32290 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
322a0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
322b0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
322c0 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
322d0 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
322e0 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
322f0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
32300 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
32310 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
32320 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
32330 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
32340 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
32350 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
32360 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
32370 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
32380 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
32390 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
323a0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
323b0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74  or..**.** If bit
323c0 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61   0x01 of the F a
323d0 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
323e0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
323f0 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 0a  C,F) is 1, then.
32400 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  ** the cursor co
32410 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
32420 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
32430 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
32440 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b   have been.** sk
32450 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c  ipped if the SQL
32460 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20   index had been 
32470 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
32480 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   The F argument 
32490 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20  is a.** hint to 
324a0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20  the implement.  
324b0 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c 69 74  The native SQLit
324c0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
324d0 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a  tation does not.
324e0 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  ** use this hint
324f0 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
32500 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
32510 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
32520 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
32530 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
32540 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
32550 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
32560 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
32570 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
32580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
32590 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
325a0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
325b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
325c0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
325d0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
325e0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
325f0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
32600 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
32610 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
32620 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
32630 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
32640 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
32650 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
32660 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
32670 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
32680 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32690 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
326a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
326b0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
326c0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
326d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
326e0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
326f0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
32700 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
32710 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
32720 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
32730 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
32740 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
32750 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
32760 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
32770 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
32780 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
32790 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Next<0 ){.      
327a0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
327b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
327c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
327d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
327e0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
327f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
32800 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
32810 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
32820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32830 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
32840 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
32850 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
32860 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72   pCur->ix;.    r
32870 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
32880 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
32890 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
328a0 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
328b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
328c0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
328d0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
328e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
328f0 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29  e( pCur->ix==0 )
32900 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
32910 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
32920 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
32930 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
32940 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
32950 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
32960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
32970 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
32980 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
32990 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
329a0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
329b0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
329c0 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
329d0 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
329e0 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ;..    pCur->ix-
329f0 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
32a00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
32a10 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
32a20 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
32a30 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
32a40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
32a50 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
32a60 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  us(pCur, 0);.   
32a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
32a80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
32a90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
32aa0 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
32ab0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
32ac0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
32ad0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
32ae0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
32af0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
32b00 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
32b10 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
32b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
32b30 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
32b40 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
32b50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
32b60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32b70 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
32b80 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
32b90 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
32ba0 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72  SQLite */.  pCur
32bb0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
32bc0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
32bd0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
32be0 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
32bf0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
32c00 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
32c10 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
32c20 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
32c30 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  >ix==0.   || pCu
32c40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
32c50 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
32c60 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
32c70 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
32c80 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ur);.  }.  pCur-
32c90 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  >ix--;.  return 
32ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
32cb0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
32cc0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
32cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
32ce0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
32cf0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
32d00 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
32d10 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
32d20 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
32d30 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
32d40 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
32d50 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
32d60 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
32d70 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
32d80 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
32d90 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
32da0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
32db0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
32dc0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
32dd0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
32de0 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
32df0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
32e00 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
32e10 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
32e20 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
32e30 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
32e40 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69  rror.  *ppPage i
32e50 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e  s set to NULL in
32e60 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
32e70 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
32e80 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
32e90 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
32ea0 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
32eb0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
32ec0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
32ed0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
32ee0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
32ef0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
32f00 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
32f10 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
32f20 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
32f30 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
32f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32f50 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
32f60 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
32f70 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
32f80 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
32f90 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
32fa0 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
32fb0 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
32fc0 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
32fd0 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
32fe0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
32ff0 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
33000 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
33010 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
33020 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
33030 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
33040 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
33050 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
33060 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
33070 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
33080 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
33090 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
330a0 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
330b0 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
330c0 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
330d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
330e0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
330f0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
33100 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
33110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
33120 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
33130 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
33140 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
33150 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
33160 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
33170 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
33180 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
33190 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
331a0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
331b0 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
331c0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
331d0 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
331e0 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
331f0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
33200 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
33210 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
33220 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
33230 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
33240 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
33250 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
33260 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
33270 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
33280 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
33290 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
332a0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
332b0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
332c0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
332d0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
332e0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
332f0 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
33300 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
33310 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
33320 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
33330 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33340 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
33350 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
33360 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
33370 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
33380 72 62 79 3e 30 20 26 26 20 52 45 51 55 49 52 45  rby>0 && REQUIRE
33390 5f 50 54 52 4d 41 50 20 29 20 29 3b 0a 20 20 70  _PTRMAP ) );.  p
333a0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
333b0 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
333c0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
333d0 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
333e0 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
333f0 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
33400 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
33410 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
33420 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
33430 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
33440 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
33450 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
33460 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
33470 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
33480 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
33490 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
334a0 20 20 69 66 28 20 49 53 43 4f 4e 43 55 52 52 45    if( ISCONCURRE
334b0 4e 54 3d 3d 30 20 26 26 20 6e 3e 3d 6d 78 50 61  NT==0 && n>=mxPa
334c0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
334d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
334e0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
334f0 45 6e 73 75 72 65 20 70 61 67 65 20 31 20 69 73  Ensure page 1 is
33500 20 77 72 69 74 61 62 6c 65 2e 20 54 68 69 73 20   writable. This 
33510 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 65 69  function will ei
33520 74 68 65 72 20 63 68 61 6e 67 65 20 74 68 65 20  ther change the 
33530 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70  number.  ** of p
33540 61 67 65 73 20 69 6e 20 74 68 65 20 66 72 65 65  ages in the free
33550 2d 6c 69 73 74 20 6f 72 20 74 68 65 20 73 69 7a  -list or the siz
33560 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
33570 65 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 62 6f  e file. Since bo
33580 74 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65  th.  ** of these
33590 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e 76 6f   operations invo
335a0 6c 76 65 20 6d 6f 64 69 66 79 69 6e 67 20 70 61  lve modifying pa
335b0 67 65 20 31 20 68 65 61 64 65 72 20 66 69 65 6c  ge 1 header fiel
335c0 64 73 2c 20 70 61 67 65 20 31 0a 20 20 2a 2a 20  ds, page 1.  ** 
335d0 77 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c 79 20  will definitely 
335e0 62 65 20 77 72 69 74 74 65 6e 20 62 79 20 74 68  be written by th
335f0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
33600 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f  If this is an CO
33610 4e 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20 74 72  NCURRENT.  ** tr
33620 61 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73 75 72  ansaction, ensur
33630 65 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  e the BtreePtrma
33640 70 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  p structure has 
33650 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20  been allocated. 
33660 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
33670 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
33680 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
33690 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
336a0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20   rc;..  if( n>0 
336b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
336c0 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
336d0 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
336e0 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
336f0 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
33700 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
33710 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
33720 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
33730 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
33740 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
33750 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53  y' */.    u32 nS
33760 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20  earch = 0;   /* 
33770 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  Count of the num
33780 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74  ber of search at
33790 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20  tempts */.    . 
337a0 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
337b0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
337c0 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
337d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
337e0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
337f0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
33800 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
33810 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
33820 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
33830 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
33840 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
33850 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
33860 2a 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  */.    if( eMode
33870 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
33880 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
33890 20 49 53 41 55 54 4f 56 41 43 55 55 4d 21 3d 49   ISAUTOVACUUM!=I
338a0 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b 0a 20  SCONCURRENT );. 
338b0 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
338c0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
338d0 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
338e0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
338f0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
33900 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
33910 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  rby>0 );.       
33920 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
33930 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
33940 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
33950 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
33960 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
33970 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
33980 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33990 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70          if( eTyp
339a0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
339b0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GE ){.          
339c0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
339d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
339e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
339f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 61  lse{.        sea
33a00 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
33a10 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
33a20 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
33a30 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
33a40 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
33a50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
33a60 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
33a70 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
33a80 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
33a90 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
33aa0 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
33ab0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
33ac0 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
33ad0 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
33ae0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
33af0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
33b00 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
33b10 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
33b20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
33b30 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
33b40 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
33b50 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
33b60 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
33b70 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
33b80 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
33b90 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
33ba0 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
33bb0 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
33bc0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
33bd0 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
33be0 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20  ALLOC_EXACT).   
33bf0 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70   ** or until a p
33c00 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e  age less than 'n
33c10 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
33c20 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
33c30 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20  C_LT).    */.   
33c40 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
33c50 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
33c60 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
33c70 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
33c80 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
33c90 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54   R-01506-11053 T
33ca0 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
33cb0 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
33cc0 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
33cd0 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65    ** is the page
33ce0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
33cf0 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ext freelist tru
33d00 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  nk page in the l
33d10 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ist or.        *
33d20 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69  * zero if this i
33d30 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c  s the last freel
33d40 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
33d50 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
33d60 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
33d70 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
33d80 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
33d90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
33da0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34  DENCE-OF: R-5984
33db0 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79  1-13798 The 4-by
33dc0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
33dd0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
33de0 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  32.        ** st
33df0 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75  ores the page nu
33e00 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
33e10 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72  t page of the fr
33e20 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20  eelist, or zero 
33e30 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  if.        ** th
33e40 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
33e50 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  pty. */.        
33e60 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
33e70 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
33e80 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
33e90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
33ea0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
33eb0 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
33ec0 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61  k>mxPage || nSea
33ed0 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20  rch++ > n ){.   
33ee0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
33ef0 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
33f00 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76  revTrunk ? pPrev
33f10 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29  Trunk->pgno : 1)
33f20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
33f30 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
33f40 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
33f50 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
33f60 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
33f70 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
33f80 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
33f90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
33fa0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
33fb0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
33fc0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
33fd0 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
33fe0 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
33ff0 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ata!=0 );.      
34000 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
34010 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68  R-13523-04394 Th
34020 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
34030 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
34040 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
34050 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
34060 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f   of leaf page po
34070 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77  inters to follow
34080 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67  . */.      k = g
34090 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
340a0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
340b0 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
340c0 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
340d0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
340e0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
340f0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
34100 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
34110 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
34120 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
34130 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
34140 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
34150 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
34160 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
34170 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
34180 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
34190 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
341a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
341b0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
341c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
341d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
341e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
341f0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
34200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
34210 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
34220 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
34230 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
34240 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
34250 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
34260 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
34270 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
34280 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
34290 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
342a0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
342b0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
342c0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
342d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
342e0 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
342f0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
34300 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
34310 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
34320 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
34330 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
34340 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
34350 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34360 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
34370 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
34380 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
34390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
343a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
343b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
343c0 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
343d0 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
343e0 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
343f0 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
34400 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
34410 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
34420 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
34430 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
34440 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
34450 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
34460 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
34470 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
34480 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
34490 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
344a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
344b0 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
344c0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
344d0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
344e0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
344f0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
34500 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34510 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
34520 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
34530 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
34540 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
34550 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
34560 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
34570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
34580 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
34590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
345a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
345b0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
345c0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
345d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
345e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
345f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34600 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
34610 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
34620 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34640 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
34650 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
34660 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
34670 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
34680 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
34690 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
346a0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
346b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
346c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
346d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
346e0 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
346f0 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
34700 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
34710 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
34720 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
34730 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
34740 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
34750 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
34760 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
34770 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
34780 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34790 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
347a0 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
347b0 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
347c0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
347d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
347e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
347f0 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
34800 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
34810 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
34820 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
34830 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
34840 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
34850 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
34860 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
34870 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
34880 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
34890 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
348a0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
348b0 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
348c0 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
348d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
348e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
348f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
34900 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
34910 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34920 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34930 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
34940 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
34950 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
34960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34970 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
34980 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
34990 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
349a0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
349b0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
349c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
349d0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
349e0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
349f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
34a00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
34a10 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
34a20 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
34a30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
34a40 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
34a50 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
34a60 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
34a70 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
34a80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
34a90 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
34aa0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
34ab0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
34ac0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34ad0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34ae0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
34af0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
34b00 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
34b10 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
34b20 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
34b30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34b40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34b50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34b60 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
34b70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
34b80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
34b90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
34ba0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
34bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
34bc0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
34bd0 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
34be0 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
34bf0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
34c00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
34c10 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
34c20 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
34c30 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
34c40 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
34c50 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
34c60 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
34c70 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
34c80 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
34c90 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
34ca0 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
34cb0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
34cc0 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
34cd0 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
34ce0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
34cf0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
34d00 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
34d10 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
34d20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
34d30 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
34d40 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
34d50 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
34d60 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
34d70 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
34d80 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
34d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
34da0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
34db0 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
34dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
34dd0 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
34de0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
34df0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
34e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
34e10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
34e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34e30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
34e40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
34e50 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
34e60 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
34e70 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
34e80 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
34e90 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
34ea0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
34eb0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
34ec0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
34ed0 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
34ee0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
34ef0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
34f00 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
34f10 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
34f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34f30 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
34f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34f50 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
34f60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
34f90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
34fa0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
34fb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
34fc0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
34fd0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
34fe0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
34ff0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
35000 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
35010 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
35020 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
35030 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
35040 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b  PT_PGNO(iTrunk);
35050 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
35060 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
35070 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
35080 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
35090 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
350a0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
350b0 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
350c0 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
350d0 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
350e0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
350f0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
35100 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
35110 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
35120 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
35130 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
35140 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
35150 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
35160 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
35170 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
35180 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
35190 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
351a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
351b0 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
351c0 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
351d0 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
351e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
351f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35200 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
35210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
35220 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
35230 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
35240 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
35250 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
35260 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
35270 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
35280 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
35290 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
352a0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
352b0 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
352c0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
352d0 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
352e0 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
352f0 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
35300 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
35310 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
35320 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
35330 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
35340 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
35350 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
35360 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35380 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35390 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
353a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
353b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
353c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
353d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
353e0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
353f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35400 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
35410 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
35420 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35430 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
35440 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
35450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
35460 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
35470 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
35480 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
35490 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
354a0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
354b0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
354c0 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
354d0 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
354e0 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
354f0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
35500 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
35510 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
35520 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
35530 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
35540 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
35550 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
35560 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
35570 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
35580 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
35590 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
355a0 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
355b0 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
355c0 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
355d0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
355e0 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
355f0 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
35600 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
35610 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
35620 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
35630 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
35640 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
35650 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
35660 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
35670 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
35680 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
35690 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
356a0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
356b0 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
356c0 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
356d0 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
356e0 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
356f0 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
35700 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
35710 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
35720 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
35730 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
35740 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
35750 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
35760 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
35770 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
35780 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
35790 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
357a0 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
357b0 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
357c0 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
357d0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
357e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
357f0 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
35800 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
35810 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
35820 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
35830 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
35840 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
35850 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
35860 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
35870 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
35880 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
35890 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
358a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
358b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
358c0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
358d0 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
358e0 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
358f0 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45  Truncate))? PAGE
35900 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a  R_GET_NOCONTENT:
35910 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
35920 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35930 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
35940 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
35950 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
35960 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
35970 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
35980 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
35990 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
359a0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
359b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
359c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
359d0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
359e0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
359f0 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
35a00 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
35a10 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
35a20 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
35a30 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
35a40 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
35a50 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
35a60 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
35a70 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
35a80 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
35a90 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
35aa0 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
35ab0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
35ac0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
35ad0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
35ae0 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
35af0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
35b00 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
35b10 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
35b20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
35b30 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
35b40 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
35b50 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
35b60 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
35b70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35b80 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
35b90 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
35ba0 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74  sedPage(pBt, pBt
35bb0 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
35bc0 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
35bd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
35bf0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35c00 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
35c10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
35c20 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
35c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35c40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
35c50 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
35c60 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
35c70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
35c80 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
35c90 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
35ca0 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
35cb0 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
35cc0 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
35cd0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
35ce0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
35cf0 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
35d00 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
35d10 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
35d20 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
35d30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
35d40 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
35d50 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
35d60 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
35d70 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
35d80 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
35d90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
35da0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
35db0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
35dc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35dd0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
35de0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
35df0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
35e00 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
35e10 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
35e20 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
35e30 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
35e40 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
35e50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
35e60 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
35e70 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
35e80 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
35e90 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
35ea0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
35eb0 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  nk);.  assert( r
35ec0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
35ed0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
35ee0 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
35ef0 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20  e)->pDbPage)<=1 
35f00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
35f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a  =SQLITE_OK || (*
35f20 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
35f30 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
35f40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
35f50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
35f60 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
35f70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
35f80 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
35f90 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
35fa0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
35fb0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
35fc0 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
35fd0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
35fe0 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
35ff0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
36000 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
36010 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
36020 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
36030 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
36040 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
36050 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
36060 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
36070 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
36080 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
36090 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
360a0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
360b0 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
360c0 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
360d0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
360e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
360f0 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
36100 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
36110 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
36120 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
36130 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
36140 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
36150 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
36160 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
36170 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
36180 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
36190 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
361a0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
361b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
361c0 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
361d0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
361e0 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
361f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36200 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
36210 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
36220 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
36230 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
36240 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
36250 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
36260 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
36270 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
36280 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
36290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
362a0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
362b0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
362c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
362d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
362f0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
36300 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
36310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36320 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
36330 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
36340 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
36350 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
36360 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
36370 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
36380 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50  CORRUPT_DB || iP
36390 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
363a0 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
363b0 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
363c0 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
363d0 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e  iPage<2 ) return
363e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
363f0 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d  BKPT;.  if( pMem
36400 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
36410 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
36420 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
36430 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
36440 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36450 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
36460 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
36470 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
36480 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
36490 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
364a0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
364b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
364c0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
364d0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
364e0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
364f0 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
36500 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
36510 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
36520 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
36530 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
36540 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
36550 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
36560 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
36570 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
36580 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
36590 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
365a0 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
365b0 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
365c0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
365d0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
365e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
365f0 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
36600 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
36610 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
36620 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
36630 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
36640 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
36650 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
36660 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
36670 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
36680 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
36690 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
366a0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
366b0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
366c0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
366d0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
366e0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
366f0 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
36700 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
36710 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
36720 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
36730 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
36740 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 52 45 51  ..  */.  if( REQ
36750 55 49 52 45 5f 50 54 52 4d 41 50 20 29 7b 0a 20  UIRE_PTRMAP ){. 
36760 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
36770 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
36780 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
36790 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
367a0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
367b0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
367c0 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
367d0 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
367e0 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
367f0 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
36800 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
36810 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
36820 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
36830 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
36840 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
36850 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
36860 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
36870 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
36880 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
36890 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
368a0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
368b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
368c0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
368d0 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
368e0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
368f0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
36900 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
36910 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
36920 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
36930 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
36940 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
36950 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
36960 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
36970 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
36980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36990 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
369a0 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
369b0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
369c0 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
369d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
369e0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
369f0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
36a00 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
36a10 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
36a20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36a30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
36a40 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
36a50 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
36a60 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
36a70 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
36a80 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
36a90 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
36aa0 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
36ab0 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
36ac0 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
36ad0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
36ae0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
36af0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
36b00 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
36b10 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
36b20 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
36b30 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
36b40 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
36b50 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
36b60 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
36b70 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
36b80 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
36b90 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
36ba0 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
36bb0 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
36bc0 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
36bd0 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
36be0 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
36bf0 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
36c00 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
36c10 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
36c20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
36c30 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
36c40 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
36c50 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
36c60 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
36c70 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
36c80 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
36c90 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
36ca0 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
36cb0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
36cc0 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
36cd0 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
36ce0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
36cf0 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
36d00 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
36d10 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
36d20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
36d30 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
36d40 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
36d50 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
36d60 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
36d70 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
36d80 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
36d90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
36da0 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
36db0 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
36dc0 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
36dd0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
36de0 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
36df0 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
36e00 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
36e10 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
36e20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
36e30 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
36e40 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
36e50 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
36e60 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
36e70 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
36e80 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
36e90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
36ea0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
36eb0 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65  19920-11576 Howe
36ec0 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69  ver, newer versi
36ed0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74  ons of SQLite st
36ee0 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f  ill.      ** avo
36ef0 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73  id using the las
36f00 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e  t six entries in
36f10 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72   the freelist tr
36f20 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69  unk page array i
36f30 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
36f40 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66   that database f
36f50 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20  iles created by 
36f60 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
36f70 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a  f SQLite can be.
36f80 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79        ** read by
36f90 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
36fa0 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20  of SQLite..     
36fb0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
36fc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36fd0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
36fe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
36ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37000 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
37010 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
37020 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
37030 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
37040 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
37050 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
37060 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
37070 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  e && (pBt->btsFl
37080 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
37090 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
370a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
370b0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
370c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
370d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
370e0 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
370f0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
37100 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
37110 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
37120 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
37130 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
37140 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
37150 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
37160 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
37170 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
37180 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
37190 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
371a0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
371b0 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
371c0 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
371d0 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
371e0 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
371f0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
37200 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
37210 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
37220 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
37230 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
37240 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
37250 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
37260 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
37270 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
37280 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
37290 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
372a0 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
372b0 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
372c0 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
372d0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
372e0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
372f0 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
37300 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
37310 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
37320 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
37330 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
37340 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
37350 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
37360 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
37370 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
37380 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37390 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
373a0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
373b0 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
373c0 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
373d0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
373e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
373f0 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
37400 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
37410 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
37420 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
37430 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
37440 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
37450 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
37460 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
37470 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
37480 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
37490 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
374a0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
374b0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
374c0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
374d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
374e0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
374f0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
37500 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
37510 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
37520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
37530 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
37540 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
37550 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
37560 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
37570 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
37580 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
37590 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
375a0 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a  ell.  Write the.
375b0 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69  ** local Cell si
375c0 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f  ze (the number o
375d0 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f  f bytes on the o
375e0 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d  riginal page, om
375f0 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c  itting.** overfl
37600 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65  ow) into *pnSize
37610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37620 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d  clearCell(.  Mem
37630 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
37640 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
37650 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
37660 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the Cell */.  un
37670 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
37680 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ll,    /* First 
37690 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  byte of the Cell
376a0 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
376b0 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f  pInfo          /
376c0 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  * Size informati
376d0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c  on about the cel
376e0 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  l */.){.  BtShar
376f0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
37700 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  >pBt;.  Pgno ovf
37710 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
37720 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
37730 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
37740 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
37750 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
37760 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
37770 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  x) );.  pPage->x
37780 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
37790 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
377a0 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f    if( pInfo->nLo
377b0 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79  cal==pInfo->nPay
377c0 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75  load ){.    retu
377d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
377e0 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
377f0 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
37800 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
37810 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
37820 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69  pCell+pInfo->nSi
37830 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44  ze-1 > pPage->aD
37840 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
37850 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65  age ){.    /* Ce
37860 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ll extends past 
37870 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20  end of page */. 
37880 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37890 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
378a0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
378b0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
378c0 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49  4byte(pCell + pI
378d0 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b  nfo->nSize - 4);
378e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
378f0 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
37900 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
37910 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
37920 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
37930 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  = (pInfo->nPaylo
37940 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  ad - pInfo->nLoc
37950 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
37960 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
37970 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
37980 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28  Ovfl>0 || .    (
37990 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70  CORRUPT_DB && (p
379a0 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b  Info->nPayload +
379b0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f   ovflPageSize)<o
379c0 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29  vflPageSize).  )
379d0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
379e0 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
379f0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
37a00 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
37a10 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
37a20 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
37a30 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
37a40 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
37a50 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
37a60 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
37a70 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
37a80 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
37a90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
37aa0 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
37ab0 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
37ac0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
37ad0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
37ae0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
37af0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
37b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37b10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
37b20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
37b30 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
37b40 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
37b50 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
37b60 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
37b70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
37b80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37b90 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
37ba0 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
37bb0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
37bc0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
37bd0 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
37be0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
37bf0 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
37c00 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
37c10 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
37c20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
37c30 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
37c40 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
37c50 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
37c60 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
37c70 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
37c80 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
37c90 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
37ca0 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
37cb0 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
37cc0 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
37cd0 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
37ce0 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
37cf0 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
37d00 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
37d10 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
37d20 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
37d30 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
37d40 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
37d50 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
37d60 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
37d70 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
37d80 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
37d90 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
37da0 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
37db0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
37dc0 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
37dd0 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
37de0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
37df0 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
37e00 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
37e10 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
37e20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
37e30 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
37e40 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
37e50 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
37e60 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
37e70 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
37e80 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
37e90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
37ea0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
37eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
37ec0 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
37ed0 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
37ee0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
37ef0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
37f00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37f10 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
37f20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
37f30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37f40 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
37f50 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
37f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37f70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
37f80 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
37f90 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
37fa0 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
37fb0 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
37fc0 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
37fd0 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
37fe0 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
37ff0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
38000 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
38010 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
38020 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
38030 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
38040 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
38050 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
38060 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
38070 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
38080 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
38090 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
380a0 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
380b0 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
380c0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
380d0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
380e0 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
380f0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
38100 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
38110 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
38120 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
38130 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
38140 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
38150 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
38160 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
38170 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
38180 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
38190 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
381a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
381b0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
381c0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
381d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
381e0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
381f0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
38200 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
38210 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72  l */.  const Btr
38220 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20  eePayload *pX,  
38230 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64        /* Payload
38240 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63   with which to c
38250 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c  onstruct the cel
38260 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  l */.  int *pnSi
38270 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
38280 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
38290 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
382a0 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
382b0 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
382c0 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
382d0 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
382e0 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
382f0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
38300 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
38310 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
38320 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
38330 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
38340 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
38350 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
38360 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
38370 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
38380 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
38390 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
383a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
383b0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
383c0 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
383d0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
383e0 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
383f0 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
38400 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
38410 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
38420 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
38430 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
38440 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
38450 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
38460 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
38470 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
38480 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
38490 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c