/ Hex Artifact Content
Login

Artifact 0c27fb9b4bfd610261e2ac8956090fbf04b607b0d12bc0f1d77b6c5bf3ab3c7d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
5a40: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
5a50: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
5a60: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
5a70: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
5a80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
5a90: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
5aa0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5ac0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
5ad0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5ae0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5af0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5b10: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5b40: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5b50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5b70: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
5b80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5b90: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
5ba0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5bd0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5be0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5bf0: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5c00: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5c10: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5c20: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5c30: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
5c40: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
5c50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
5c60: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
5c70: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
5c80: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
5c90: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5ca0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
5cb0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5cc0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5cd0: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5cf0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5d00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5d10: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5d20: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
5d30: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
5d40: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5d50: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
5d60: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
5d70: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d80: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
5d90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5da0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5db0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5dc0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5dd0: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5de0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5df0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5e00: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
5e10: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e30: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5e40: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
5e50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
5e60: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5e70: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5e80: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5e90: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5ea0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5eb0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5ee0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5ef0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5f00: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
5f10: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
5f20: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
5f30: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5f40: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5f50: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5f60: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5f70: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5f80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5f90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5fa0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5fb0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5fc0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5fd0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5fe0: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5ff0: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
6000: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
6010: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
6020: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
6030: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
6040: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
6050: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
6060: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
6070: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
6080: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
6090: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
60a0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
60b0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
60c0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
60d0: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
60e0: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
60f0: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
6100: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
6110: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
6120: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
6130: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
6140: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
6150: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
6160: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
6170: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
6180: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
6190: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
61a0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
61b0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
61c0: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
61d0: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
61e0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
61f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
6200: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
6210: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
6220: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
6230: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
6240: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
6250: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
6260: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
6270: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
6280: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
6290: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
62a0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
62b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
62c0: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
62d0: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
62e0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
62f0: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
6300: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
6310: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
6320: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6330: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
6340: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
6350: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
6360: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
6370: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
6380: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
6390: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
63a0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
63b0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
63c0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
63d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
63e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
63f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6400: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
6410: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
6420: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
6430: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
6440: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6450: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6460: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6470: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6480: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
6490: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
64a0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
64b0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
64c0: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
64d0: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
64e0: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
64f0: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
6500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
6520: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
6530: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
6540: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
6550: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
6560: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
6570: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
6580: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
6590: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
65a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
65b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
65c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
65d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
65e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
65f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
6600: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
6610: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
6620: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
6630: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
6640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
6650: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6660: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6670: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6690: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
66a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
66b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
66c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
66d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
66e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
66f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6700: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
6710: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
6720: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
6730: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
6740: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6750: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6760: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6770: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
6780: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
6790: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
67a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
67b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
67c0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
67d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
67e0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
67f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6800: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6810: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6830: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6840: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
6850: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
6860: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6870: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
6880: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
6890: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
68a0: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
68b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
68c0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
68d0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
68e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
68f0: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
6900: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
6910: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
6920: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6930: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
6940: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6950: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
6960: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
6970: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6980: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
6990: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
69a0: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
69b0: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
69c0: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
69d0: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
69e0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
69f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
6a00: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
6a10: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
6a20: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
6a30: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
6a40: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
6a70: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
6a80: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
6a90: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
6aa0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
6ab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
6ac0: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
6ad0: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
6ae0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
6af0: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
6b00: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
6b10: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
6b20: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
6b30: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
6b40: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
6b50: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
6b60: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6b90: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
6ba0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
6bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
6bd0: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
6be0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
6bf0: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
6c00: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
6c10: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
6c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
6c30: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
6c40: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
6c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
6c60: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
6c70: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
6c80: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6c90: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6ca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6cc0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6cd0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6ce0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6cf0: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6d00: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6d20: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6d30: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
6d40: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
6d50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6d60: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
6d70: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6d80: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
6d90: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6da0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6db0: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
6dc0: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
6dd0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
6de0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6df0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
6e00: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6e20: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6e30: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6e40: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6e50: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6e60: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6e70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6e80: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6e90: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6ea0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6eb0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
6ec0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
6ed0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
6ee0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
6ef0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
6f00: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
6f10: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6f20: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6f30: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6f40: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6f50: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6f60: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6f70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6f90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6fa0: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6fb0: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
6fc0: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
6fd0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6fe0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6ff0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
7000: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
7010: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
7020: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
7030: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
7040: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
7050: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
7060: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
7070: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
7080: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
7090: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
70a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
70b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
70c0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
70d0: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
70e0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
70f0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
7100: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7110: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
7120: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
7130: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
7140: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
7150: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
7160: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
7170: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7180: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
7190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
71a0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
71c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
71d0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
71e0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
71f0: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
7200: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7210: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
7220: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
7230: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
7240: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7250: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
7260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
7270: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
7280: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
7290: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
72a0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
72b0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
72c0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
72d0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
72e0: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
72f0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
7300: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
7310: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
7320: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
7330: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
7340: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
7350: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
7360: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
7370: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
7380: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
7390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
73a0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
73b0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
73c0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
73d0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
73e0: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
73f0: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
7400: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
7410: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
7420: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
7430: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
7440: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
7450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7460: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7470: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
7480: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
7490: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
74a0: 54 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c  T(pCur).       |
74b0: 7c 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42  | pCur==sqlite3B
74c0: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
74d0: 73 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72  sor() );.  asser
74e0: 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  t( offsetof(BtCu
74f0: 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30  rsor, eState)==0
7500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69   );.  assert( si
7510: 7a 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74  zeof(pCur->eStat
7520: 65 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  e)==1 );.  retur
7530: 6e 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21  n CURSOR_VALID !
7540: 3d 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a  = *(u8*)pCur;.}.
7550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7560: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b  pointer to a fak
7570: 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
7580: 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61  t that will alwa
7590: 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c  ys answer.** fal
75a0: 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  se to the sqlite
75b0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
75c0: 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61  oved() routine a
75d0: 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a  bove.  The fake.
75e0: 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e  ** cursor return
75f0: 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75  ed must not be u
7600: 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  sed with any oth
7610: 65 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61  er Btree interfa
7620: 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20  ce..*/.BtCursor 
7630: 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b  *sqlite3BtreeFak
7640: 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69  eValidCursor(voi
7650: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20  d){.  static u8 
7660: 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52  fakeCursor = CUR
7670: 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73  SOR_VALID;.  ass
7680: 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74  ert( offsetof(Bt
7690: 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d  Cursor, eState)=
76a0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
76b0: 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43  BtCursor*)&fakeC
76c0: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
76d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  This routine res
76e0: 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62  tores a cursor b
76f0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
7700: 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74  nal position aft
7710: 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65  er it.** has bee
7720: 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20  n moved by some 
7730: 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79  outside activity
7740: 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65   (such as a btre
7750: 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a  e rebalance or.*
7760: 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62  * a row having b
7770: 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
7780: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
7790: 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  ursor).  .**.** 
77a0: 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20  On success, the 
77b0: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70  *pDifferentRow p
77c0: 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73  arameter is fals
77d0: 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  e if the cursor 
77e0: 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74  is left.** point
77f0: 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74  ing at exactly t
7800: 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70  he same row.  *p
7810: 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74  DifferntRow is t
7820: 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f  he row the curso
7830: 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e  r.** was pointin
7840: 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65  g to has been de
7850: 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74  leted, forcing t
7860: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
7870: 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65  nt to some.** ne
7880: 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  arby row..**.** 
7890: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
78a0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
78b0: 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  ed for a cursor 
78c0: 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e  that just return
78d0: 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20  ed.** TRUE from 
78e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
78f0: 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f  orHasMoved()..*/
7900: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
7910: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42  eCursorRestore(B
7920: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
7930: 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  nt *pDifferentRo
7940: 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  w){.  int rc;.. 
7950: 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
7960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
7970: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
7980: 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63  OR_VALID );.  rc
7990: 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
79a0: 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
79b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
79c0: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
79d0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
79e0: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
79f0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7a00: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
7a10: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7a20: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
7a30: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
7a40: 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  ipNext==0 );.   
7a50: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7a60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
7a70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7a80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7a90: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
7aa0: 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  S./*.** Provide 
7ab0: 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72  hints to the cur
7ac0: 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69 63  sor.  The partic
7ad0: 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20  ular hint given 
7ae0: 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a  (and the type.**
7af0: 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74   and number of t
7b00: 68 65 20 76 61 72 61 72 67 73 20 70 61 72 61 6d  he varargs param
7b10: 65 74 65 72 73 29 20 69 73 20 64 65 74 65 72 6d  eters) is determ
7b20: 69 6e 65 64 20 62 79 20 74 68 65 20 65 48 69 6e  ined by the eHin
7b30: 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74  tType.** paramet
7b40: 65 72 2e 20 20 53 65 65 20 74 68 65 20 64 65 66  er.  See the def
7b50: 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  initions of the 
7b60: 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63  BTREE_HINT_* mac
7b70: 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ros for details.
7b80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7b90: 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28  BtreeCursorHint(
7ba0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7bb0: 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e  int eHintType, .
7bc0: 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f  ..){.  /* Used o
7bd0: 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74 68  nly by system th
7be0: 61 74 20 73 75 62 73 74 69 74 75 74 65 20 74 68  at substitute th
7bf0: 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20  eir own storage 
7c00: 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64  engine */.}.#end
7c10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  if../*.** Provid
7c20: 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20  e flag hints to 
7c30: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76  the cursor..*/.v
7c40: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
7c50: 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28  CursorHintFlags(
7c60: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7c70: 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61  unsigned x){.  a
7c80: 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f  ssert( x==BTREE_
7c90: 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54  SEEK_EQ || x==BT
7ca0: 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20  REE_BULKLOAD || 
7cb0: 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e  x==0 );.  pCur->
7cc0: 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23  hints = x;.}...#
7cd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7ce0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
7cf0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
7d00: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
7d10: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
7d20: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
7d30: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
7d40: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
7d50: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
7d60: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
7d70: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
7d80: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  page number..**.
7d90: 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74  ** Return 0 (not
7da0: 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66   a valid page) f
7db0: 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65  or pgno==1 since
7dc0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
7dd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f  pointer map asso
7de0: 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
7df0: 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69   1.  The integri
7e00: 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a  ty_check logic.*
7e10: 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  * requires that 
7e20: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31  ptrmapPageno(*,1
7e30: 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )!=1..*/.static 
7e40: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
7e50: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
7e60: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
7e70: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
7e80: 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  age;.  Pgno iPtr
7e90: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
7ea0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7eb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
7ec0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
7ed0: 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <2 ) return 0;. 
7ee0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
7ef0: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
7f00: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
7f10: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
7f20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
7f30: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
7f40: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
7f50: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
7f60: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
7f70: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
7f80: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
7f90: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
7fa0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
7fb0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
7fc0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
7fd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
7fe0: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
7ff0: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8000: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
8010: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
8020: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
8030: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
8040: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
8050: 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  o'..**.** If *pR
8060: 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  C is initially n
8070: 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c  on-zero (non-SQL
8080: 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69  ITE_OK) then thi
8090: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
80a0: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20  a no-op.  If an 
80b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
80c0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
80d0: 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74  ror code is writ
80e0: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43  ten.** into *pRC
80f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8100: 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61   ptrmapPut(BtSha
8110: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
8120: 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67  ey, u8 eType, Pg
8130: 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a  no parent, int *
8140: 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  pRC){.  DbPage *
8150: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
8160: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8170: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
8180: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
81a0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
81b0: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
81c0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
81d0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
81e0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
81f0: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
8200: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
8210: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
8220: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
8230: 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
8240: 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  ons */..  if( *p
8250: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
8260: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8270: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
8280: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
8290: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
82a0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75  l page number mu
82b0: 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  st never be used
82c0: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61   as a pointer ma
82d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65  p page */.  asse
82e0: 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53  rt( 0==PTRMAP_IS
82f0: 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e  PAGE(pBt, PENDIN
8300: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
8310: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
8320: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
8330: 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20  );.  if( key==0 
8340: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
8350: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8360: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
8370: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
8380: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
8390: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
83a0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
83b0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
83c0: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30  map, &pDbPage, 0
83d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
83e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
83f0: 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
8400: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65  urn;.  }.  offse
8410: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8420: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8430: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8440: 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  <0 ){.    *pRC =
8450: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8460: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
8470: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
8480: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
8490: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
84a0: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
84b0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
84c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
84d0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
84e0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
84f0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
8500: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8510: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
8520: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
8530: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
8540: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
8550: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
8560: 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43  rent));.    *pRC
8570: 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  = rc = sqlite3Pa
8580: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
8590: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
85a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
85b0: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
85c0: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
85d0: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
85e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
85f0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
8600: 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20  ..ptrmap_exit:. 
8610: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
8620: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a  ef(pDbPage);.}..
8630: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
8640: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
8650: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
8660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
8670: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
8680: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
8690: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
86a0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
86b0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
86c0: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
86d0: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
86e0: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
86f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
8700: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
8710: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
8720: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
8730: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
8740: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
8750: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
8760: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
8770: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
8780: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
8790: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
87a0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
87b0: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
87c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
87d0: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
87e0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
87f0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8800: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
8810: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
8820: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
8830: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
8840: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
8850: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
8860: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8870: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
8880: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
8890: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
88a0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
88b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
88c0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
88d0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
88e0: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  e, 0);.  if( rc!
88f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8900: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
8910: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
8920: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
8930: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
8940: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
8950: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
8960: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
8970: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
8980: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8990: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
89a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
89b0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
89c0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
89d0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
89e0: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
89f0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
8a00: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
8a10: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
8a20: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
8a30: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
8a40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
8a50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
8a60: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8a70: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
8a80: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
8a90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8aa0: 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d  RRUPT_PGNO(iPtrm
8ab0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ap);.  return SQ
8ac0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
8ad0: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
8ae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8af0: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
8b00: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
8b10: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
8b20: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
8b30: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
8b40: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8b50: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
8b60: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
8b70: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
8b80: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
8b90: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
8ba0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
8bb0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
8bc0: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
8bd0: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
8be0: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
8bf0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
8c00: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
8c10: 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61  **.** findCellPa
8c20: 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68 65  stPtr() does the
8c30: 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74 20   same except it 
8c40: 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20 69  skips past the i
8c50: 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65  nitial.** 4-byte
8c60: 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66   child pointer f
8c70: 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72  ound on interior
8c80: 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72 65   pages, if there
8c90: 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54   is one..**.** T
8ca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
8cb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
8cc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
8cd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
8ce0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
8cf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
8d00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
8d10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
8d20: 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
8d30: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
8d40: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
8d50: 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  e findCellPastPt
8d60: 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  r(P,I) \.  ((P)-
8d70: 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50  >aDataOfst + ((P
8d80: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
8d90: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
8da0: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
8db0: 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54  I)]))).../*.** T
8dc0: 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61  his is common ta
8dd0: 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  il processing fo
8de0: 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  r btreeParseCell
8df0: 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72  Ptr() and.** btr
8e00: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
8e10: 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63 61  dex() for the ca
8e20: 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c  se when the cell
8e30: 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e   does not fit en
8e40: 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73  tirely.** on a s
8e50: 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67  ingle B-tree pag
8e60: 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61  e.  Make necessa
8e70: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74  ry adjustments t
8e80: 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a  o the CellInfo.*
8e90: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
8ea0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
8eb0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65  INLINE void btre
8ec0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
8ed0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
8ee0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8ef0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8f00: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8f10: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
8f20: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
8f30: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8f40: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
8f50: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8f60: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8f70: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
8f80: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
8f90: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
8fa0: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
8fb0: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
8fc0: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
8fd0: 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63  have.  ** to dec
8fe0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
8ff0: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
9000: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
9010: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76  ill onto.  ** ov
9020: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
9030: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
9040: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
9050: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
9060: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
9070: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
9080: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
9090: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
90a0: 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62  torage.  ** in b
90b0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
90c0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
90d0: 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  **.  ** Warning:
90e0: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
90f0: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
9100: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
9110: 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77  ed in any.  ** w
9120: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
9130: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
9140: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
9150: 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63   */.  int minLoc
9160: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
9170: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
9180: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9190: 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c  /.  int maxLocal
91a0: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
91b0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
91c0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
91d0: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
91e0: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
91f0: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
9200: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
9210: 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20   */..  minLocal 
9220: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
9230: 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  l;.  maxLocal = 
9240: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
9250: 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e  .  surplus = min
9260: 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e  Local + (pInfo->
9270: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
9280: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
9290: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b  ->usableSize-4);
92a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72  .  testcase( sur
92b0: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29  plus==maxLocal )
92c0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
92d0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
92e0: 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c  1 );.  if( surpl
92f0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
9300: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
9310: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
9320: 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  us;.  }else{.   
9330: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9340: 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a   (u16)minLocal;.
9350: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69    }.  pInfo->nSi
9360: 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66  ze = (u16)(&pInf
9370: 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66  o->pPayload[pInf
9380: 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65  o->nLocal] - pCe
9390: 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll) + 4;.}../*.*
93a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
93b0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70  routines are imp
93c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
93d0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72  the MemPage.xPar
93e0: 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68  seCell().** meth
93f0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20  od..**.** Parse 
9400: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
9410: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
9420: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
9430: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62  ructure..**.** b
9440: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9450: 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74  ()        =>   t
9460: 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20  able btree leaf 
9470: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
9480: 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64  rseCellNoPayload
9490: 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62  ()  =>   table b
94a0: 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  tree internal no
94b0: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
94c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
94d0: 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72    =>   index btr
94e0: 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54  ee nodes.**.** T
94f0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77  here is also a w
9500: 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  rapper function 
9510: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
9520: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
9530: 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74  ** all MemPage t
9540: 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65  ypes and that re
9550: 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c  ferences the cel
9560: 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65  l by index rathe
9570: 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69  r than.** by poi
9580: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
9590: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
95a0: 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  ellPtrNoPayload(
95b0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
95c0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
95d0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
95e0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
95f0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9600: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9610: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9620: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9630: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9640: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9650: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9660: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9670: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9680: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9690: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
96a0: 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61  ->leaf==0 );.  a
96b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
96c0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
96d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
96e0: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
96f0: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
9700: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d  .#endif.  pInfo-
9710: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
9720: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
9730: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
9740: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
9750: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
9760: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9770: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  0;.  pInfo->pPay
9780: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  load = 0;.  retu
9790: 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rn;.}.static voi
97a0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
97b0: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
97c0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
97d0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
97e0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
97f0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9800: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9810: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9820: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9830: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9840: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9850: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9860: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9880: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9890: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
98a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
98b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
98c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
98d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  l payload */.  u
98e0: 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20  64 iKey;        
98f0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
9900: 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f  ted Key value */
9910: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9920: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9930: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9940: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9950: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
9960: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
9970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9980: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
9990: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
99a0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
99b0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
99c0: 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65  pCell;..  /* The
99d0: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63   next block of c
99e0: 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ode is equivalen
99f0: 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
9a00: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
9a10: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
9a20: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a  nPayload);.  **.
9a30: 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73    ** The code is
9a40: 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69   inlined to avoi
9a50: 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  d a function cal
9a60: 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f  l..  */.  nPaylo
9a70: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9a80: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9a90: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9aa0: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9ab0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9ac0: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9ad0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9ae0: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9af0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b00: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70  .    }while( (*p
9b10: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b20: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b30: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f  .  pIter++;..  /
9b40: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
9b50: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
9b60: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
9b70: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
9b80: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
9b90: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
9ba0: 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a  >nKey);.  **.  *
9bb0: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
9bc0: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
9bd0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
9be0: 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70    */.  iKey = *p
9bf0: 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79  Iter;.  if( iKey
9c00: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9c10: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9c20: 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20  7];.    iKey &= 
9c30: 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28  0x7f;.    while(
9c40: 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d  1){.      iKey =
9c50: 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b   (iKey<<7) | (*+
9c60: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
9c70: 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74 65        if( (*pIte
9c80: 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b  r)<0x80 ) break;
9c90: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
9ca0: 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  >=pEnd ){.      
9cb0: 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c    iKey = (iKey<<
9cc0: 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20  8) | *++pIter;. 
9cd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9ce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9cf0: 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49    pIter++;..  pI
9d00: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36  nfo->nKey = *(i6
9d10: 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66  4*)&iKey;.  pInf
9d20: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
9d30: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
9d40: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
9d50: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
9d60: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9d70: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9d80: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9d90: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9da0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
9db0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
9dc0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
9dd0: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
9de0: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
9df0: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
9e00: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
9e10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
9e20: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
9e30: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
9e40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
9e50: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
9e60: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
9e70: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
9e80: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
9e90: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
9ea0: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
9eb0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
9ec0: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c  )nPayload;.  }el
9ed0: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
9ee0: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
9ef0: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
9f00: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
9f10: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
9f20: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9f30: 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65  llPtrIndex(.  Me
9f40: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9f50: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9f60: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9f70: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
9f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9f90: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
9fa0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9fb0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9fd0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9fe0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
9ff0: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
a000: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
a010: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
a020: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
a030: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
a040: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a050: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
a060: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
a070: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a080: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
a090: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
a0a0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
a0b0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
a0c0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
a0d0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
a0e0: 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  f==0 );.  pIter 
a0f0: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
a100: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
a110: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
a120: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
a130: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
a140: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
a150: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
a160: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
a170: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
a180: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
a190: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a1a0: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a1b0: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a1c0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a1d0: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a1e0: 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  +;.  pInfo->nKey
a1f0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a200: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
a210: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
a220: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70  fo->pPayload = p
a230: 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Iter;.  testcase
a240: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a250: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
a260: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
a270: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
a280: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a290: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
a2a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a2b0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
a2c0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
a2d0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
a2e0: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
a2f0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
a300: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
a310: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
a320: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
a330: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
a340: 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28  Payload + (u16)(
a350: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a360: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
a370: 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  Size<4 ) pInfo->
a380: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
a390: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
a3a0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
a3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65  }else{.    btree
a3c0: 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53  ParseCellAdjustS
a3d0: 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70  izeForOverflow(p
a3e0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
a3f0: 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  fo);.  }.}.stati
a400: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
a410: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
a420: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a430: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a440: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a450: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
a460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a470: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
a480: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
a490: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a4a0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a4b0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a4c0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  ture */.){.  pPa
a4d0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a4e0: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
a4f0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49  Page, iCell), pI
a500: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  nfo);.}../*.** T
a510: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
a520: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
a530: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
a540: 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69   MemPage.xCellSi
a550: 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ze.** method..**
a560: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a570: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
a580: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
a590: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
a5a0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
a5b0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
a5c0: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
a5d0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
a5e0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
a5f0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
a600: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
a610: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
a620: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
a630: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
a640: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
a650: 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a  r..**.** cellSiz
a660: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20  ePtrNoPayload() 
a670: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e     =>   table in
a680: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
a690: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20  cellSizePtr()   
a6a0: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61            =>   a
a6b0: 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26  ll index nodes &
a6c0: 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65   table leaf node
a6d0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  s.*/.static u16 
a6e0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
a6f0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
a700: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
a710: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50  ter = pCell + pP
a720: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a730: 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  e; /* For loopin
a740: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a750: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a760: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20      /* End mark 
a790: 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a  for a varint */.
a7a0: 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20    u32 nSize;    
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a7d0: 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  ze value to retu
a7e0: 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  rn */..#ifdef SQ
a7f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a800: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a810: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a820: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a830: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a840: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
a850: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
a860: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
a870: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
a880: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
a890: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
a8a0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
a8b0: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
a8c0: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
a8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
a8e0: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
a8f0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
a900: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
a910: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
a920: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
a930: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
a940: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
a950: 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65  .#endif..  nSize
a960: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
a970: 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a   nSize>=0x80 ){.
a980: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
a990: 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20  r[8];.    nSize 
a9a0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
a9b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  .      nSize = (
a9c0: 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b  nSize<<7) | (*++
a9d0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
a9e0: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
a9f0: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
aa00: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
aa10: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20   pIter++;.  if( 
aa20: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
aa30: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
aa40: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
aa50: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
aa60: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
aa70: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
aa80: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
aa90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
aaa0: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
aab0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
aac0: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
aad0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
aae0: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
aaf0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
ab00: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
ab10: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
ab20: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
ab30: 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
ab40: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ab50: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
ab60: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
ab70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
ab80: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
ab90: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
aba0: 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b  l ){.    nSize +
abb0: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
abc0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
abd0: 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20  nSize<4 ) nSize 
abe0: 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 4;.  }else{.  
abf0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
ac00: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
ac10: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
ac20: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
ac30: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
ac40: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ac50: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
ac60: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
ac70: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
ac80: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
ac90: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
aca0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
acb0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
acc0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
acd0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
ace0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
acf0: 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75   nSize += 4 + (u
ad00: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
ad10: 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  l);.  }.  assert
ad20: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
ad30: 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52  fo.nSize || CORR
ad40: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
ad50: 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d  rn (u16)nSize;.}
ad60: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
ad70: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
ad80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ad90: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
ada0: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
adb0: 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f   + 4; /* For loo
adc0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
add0: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
ade0: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
adf0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
ae00: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
ae10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ae20: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
ae30: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
ae40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
ae50: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
ae60: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
ae70: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
ae80: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
ae90: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
aea0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
aeb0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
aec0: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
aed0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
aee0: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
aef0: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
af00: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
af10: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
af20: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
af30: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
af40: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
af50: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
af60: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
af70: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73  debuginfo);.#els
af80: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
af90: 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e  ETER(pPage);.#en
afa0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
afb0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
afc0: 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20  ze==4 );.  pEnd 
afd0: 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77  = pIter + 9;.  w
afe0: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
aff0: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
b000: 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  End );.  assert(
b010: 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65   debuginfo.nSize
b020: 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  ==(u16)(pIter - 
b030: 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50  pCell) || CORRUP
b040: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
b050: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
b060: 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65  Cell);.}...#ifde
b070: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
b080: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
b090: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
b0a0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
b0b0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
b0c0: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
b0d0: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
b0e0: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
b0f0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
b100: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  l){.  return pPa
b110: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b120: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
b130: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
b140: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
b150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b160: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
b170: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
b180: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
b190: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
b1a0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
b1b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
b1c0: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
b1d0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
b1e0: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
b1f0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
b200: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
b210: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
b220: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
b230: 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43  *pCell, int *pRC
b240: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
b250: 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29  fo;.  if( *pRC )
b260: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
b270: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
b280: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b290: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b2a0: 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
b2b0: 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
b2c0: 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
b2d0: 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
b2e0: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
b2f0: 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20  .nSize-4]);.    
b300: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
b310: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
b320: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
b330: 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b  age->pgno, pRC);
b340: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
b350: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
b360: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
b370: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
b380: 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20  organizes cells 
b390: 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61  within the.** pa
b3a0: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b3b0: 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f   are no free-blo
b3c0: 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  cks on the free-
b3d0: 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  block list..**.*
b3e0: 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78  * Parameter nMax
b3f0: 46 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69  Frag is the maxi
b400: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  mum amount of fr
b410: 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74  agmented space t
b420: 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72  hat may be.** pr
b430: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67  esent in the pag
b440: 65 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75  e after this rou
b450: 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tine returns..**
b460: 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  .** EVIDENCE-OF:
b470: 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53   R-44582-60138 S
b480: 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74  QLite may from t
b490: 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72  ime to time reor
b4a0: 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72  ganize a.** b-tr
b4b0: 65 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  ee page so that 
b4c0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65  there are no fre
b4d0: 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d  eblocks or fragm
b4e0: 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a  ent bytes, all.*
b4f0: 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  * unused bytes a
b500: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
b510: 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20  the unallocated 
b520: 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e  space region, an
b530: 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61  d all.** cells a
b540: 72 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c  re packed tightl
b550: 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  y at the end of 
b560: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
b570: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
b580: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
b590: 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46  pPage, int nMaxF
b5a0: 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  rag){.  int i;  
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
b5d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
b600: 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a   the i-th cell *
b610: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b630: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
b640: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
b650: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
b660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b670: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
b680: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
b690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
b6a0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
b6b0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
b6c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
b6d0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
b6e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b6f0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
b700: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
b710: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
b720: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b730: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
b740: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
b750: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
b760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b770: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
b780: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
b790: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
b7a0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
b7b0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
b7c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
b7d0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
b7e0: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
b7f0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69  ontent */.  unsi
b800: 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20  gned char *src; 
b810: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
b820: 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20   of content */. 
b830: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
b840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b850: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
b860: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
b870: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
b880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
b890: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
b8a0: 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65  index */..  asse
b8b0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b8c0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b8d0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b8e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b8f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b900: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
b910: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
b920: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
b930: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
b940: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b950: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b960: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b970: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
b980: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
b990: 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61   = 0;.  src = da
b9a0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
b9b0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
b9c0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
b9d0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
b9e0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
b9f0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
ba00: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
ba10: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
ba20: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
ba30: 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  ;.  iCellFirst =
ba40: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
ba50: 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53  nCell;.  usableS
ba60: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
ba70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20  ->usableSize;.. 
ba80: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68   /* This block h
ba90: 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69 74  andles pages wit
baa0: 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66  h two or fewer f
bab0: 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e  ree blocks and n
bac0: 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20  MaxFrag.  ** or 
bad0: 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64  fewer fragmented
bae0: 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20   bytes. In this 
baf0: 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74 65  case it is faste
bb00: 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20  r to move the.  
bb10: 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20  ** two (or one) 
bb20: 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20  blocks of cells 
bb30: 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20  using memmove() 
bb40: 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71 75  and add the requ
bb50: 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74  ired.  ** offset
bb60: 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65  s to each pointe
bb70: 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f  r in the cell-po
bb80: 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61 6e  inter array than
bb90: 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20   it is to .  ** 
bba0: 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  reconstruct the 
bbb0: 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f  entire page.  */
bbc0: 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74 61  .  if( (int)data
bbd0: 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61  [hdr+7]<=nMaxFra
bbe0: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72  g ){.    int iFr
bbf0: 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ee = get2byte(&d
bc00: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
bc10: 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20   if( iFree ){.  
bc20: 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d      int iFree2 =
bc30: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bc40: 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20  iFree]);..      
bc50: 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  /* pageFindSlot(
bc60: 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 76 65  ) has already ve
bc70: 72 69 66 69 65 64 20 74 68 61 74 20 66 72 65 65  rified that free
bc80: 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74   blocks are sort
bc90: 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f  ed.      ** in o
bca0: 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77  rder of offset w
bcb0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20  ithin the page, 
bcc0: 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63  and that no bloc
bcd0: 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20  k extends.      
bce0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
bcf0: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f  of the page. Pro
bd00: 76 69 64 65 64 20 74 68 65 20 74 77 6f 20 66 72  vided the two fr
bd10: 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20  ee slots do not 
bd20: 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61  .      ** overla
bd30: 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  p, this guarante
bd40: 65 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d  es that the memm
bd50: 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f  ove() calls belo
bd60: 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20  w will not.     
bd70: 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68   ** overwrite th
bd80: 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74  e usableSize byt
bd90: 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69  e buffer, even i
bda0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  f the database p
bdb0: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
bdc0: 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20  corrupt.  */.   
bdd0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
bde0: 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69  2==0 || iFree2>i
bdf0: 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Free );.      as
be00: 73 65 72 74 28 20 69 46 72 65 65 2b 67 65 74 32  sert( iFree+get2
be10: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
be20: 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  +2]) <= usableSi
be30: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
be40: 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c  rt( iFree2==0 ||
be50: 20 69 46 72 65 65 32 2b 67 65 74 32 62 79 74 65   iFree2+get2byte
be60: 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d  (&data[iFree2+2]
be70: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
be80: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
be90: 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61  =iFree2 || (data
bea0: 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64  [iFree2]==0 && d
beb0: 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30  ata[iFree2+1]==0
bec0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ) ){.        u8 
bed0: 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65  *pEnd = &data[ce
bee0: 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
bef0: 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  *2];.        u8 
bf00: 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20  *pAddr;.        
bf10: 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20  int sz2 = 0;.   
bf20: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65       int sz = ge
bf30: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
bf40: 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  ee+2]);.        
bf50: 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79  int top = get2by
bf60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
bf70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
bf80: 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20  p>=iFree ){.    
bf90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bfa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
bfb0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
bfc0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
bfd0: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
bfe0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
bff0: 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29 3b 20 2f  +sz<=iFree2 ); /
c000: 2a 20 56 65 72 69 66 69 65 64 20 62 79 20 70 61  * Verified by pa
c010: 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 2a 2f 0a  geFindSlot() */.
c020: 20 20 20 20 20 20 20 20 20 20 73 7a 32 20 3d 20            sz2 = 
c030: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
c040: 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20  Free2+2]);.     
c050: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
c060: 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32  ee+sz+sz2+iFree2
c070: 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75  -(iFree+sz) <= u
c080: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c090: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
c0a0: 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a  data[iFree+sz+sz
c0b0: 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b  2], &data[iFree+
c0c0: 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72  sz], iFree2-(iFr
c0d0: 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20  ee+sz));.       
c0e0: 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20     sz += sz2;.  
c0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c100: 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20  cbrk = top+sz;. 
c110: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
c120: 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20  brk+(iFree-top) 
c130: 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  <= usableSize );
c140: 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
c150: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64  (&data[cbrk], &d
c160: 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d  ata[top], iFree-
c170: 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  top);.        fo
c180: 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65  r(pAddr=&data[ce
c190: 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72  llOffset]; pAddr
c1a0: 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29  <pEnd; pAddr+=2)
c1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  {.          pc =
c1c0: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
c1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c1e0: 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32  pc<iFree ){ put2
c1f0: 62 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73  byte(pAddr, pc+s
c200: 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  z); }.          
c210: 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46 72 65  else if( pc<iFre
c220: 65 32 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  e2 ){ put2byte(p
c230: 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d  Addr, pc+sz2); }
c240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c250: 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65     goto defragme
c260: 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  nt_out;.      }.
c270: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72      }.  }..  cbr
c280: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
c290: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
c2a0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
c2b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
c2c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
c2d0: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
c2e0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
c2f0: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
c300: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
c310: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
c320: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
c330: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
c340: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
c350: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
c360: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
c370: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
c380: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
c390: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
c3a0: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
c3b0: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
c3c0: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
c3d0: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
c3e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c3f0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
c400: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
c410: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c420: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
c430: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
c440: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
c450: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
c460: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c470: 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e    size = pPage->
c480: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
c490: 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20   &src[pc]);.    
c4a0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20  cbrk -= size;.  
c4b0: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
c4c0: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
c4d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c4e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c4f0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
c500: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
c510: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
c520: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
c530: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
c540: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
c550: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
c560: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c570: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
c580: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c590: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
c5a0: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
c5b0: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b    if( temp==0 ){
c5c0: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
c5d0: 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63      if( cbrk==pc
c5e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c5f0: 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65     temp = sqlite
c600: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
c610: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
c620: 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  er);.      x = g
c630: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
c640: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d  r+5]);.      mem
c650: 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64  cpy(&temp[x], &d
c660: 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69  ata[x], (cbrk+si
c670: 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20  ze) - x);.      
c680: 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20  src = temp;.    
c690: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  }.    memcpy(&da
c6a0: 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70  ta[cbrk], &src[p
c6b0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  c], size);.  }. 
c6c0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c6d0: 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f  ;.. defragment_o
c6e0: 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61 5b 68  ut:.  if( data[h
c6f0: 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c  dr+7]+cbrk-iCell
c700: 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46  First!=pPage->nF
c710: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
c720: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c730: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c740: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
c750: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
c760: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c770: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
c780: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
c790: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
c7a0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c7b0: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c7c0: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c7d0: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c7e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c7f0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c800: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
c810: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c820: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
c830: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
c840: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
c850: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
c860: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
c870: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
c880: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
c890: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
c8a0: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
c8b0: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
c8c0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c8d0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
c8e0: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
c8f0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
c900: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
c910: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c920: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c930: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
c940: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
c950: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
c960: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
c970: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
c980: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
c990: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
c9a0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
c9b0: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
c9c0: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
c9d0: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
c9e0: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
c9f0: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
ca00: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
ca10: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
ca20: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
ca30: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
ca40: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
ca50: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
ca60: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
ca70: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
ca80: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
ca90: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
caa0: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
cab0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
cac0: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
cad0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
cae0: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
caf0: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
cb00: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
cb10: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
cb20: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
cb30: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
cb40: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
cb50: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
cb60: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
cb70: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
cb80: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
cb90: 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20  .  assert( pc>0 
cba0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c 3d  );.  while( pc<=
cbb0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a  usableSize-4 ){.
cbc0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cbd0: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
cbe0: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
cbf0: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
cc00: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
cc10: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
cc20: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
cc30: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
cc40: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
cc50: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
cc60: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
cc70: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
cc80: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
cc90: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
cca0: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  c+2]);.    if( (
ccb0: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
ccc0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
ccd0: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
cce0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ccf0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
cd00: 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62  ( size+pc > usab
cd10: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
cd20: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
cd30: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
cd40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
cd50: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
cd60: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
cd70: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cd80: 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32  OF: R-11498-5802
cd90: 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  2 In a well-form
cda0: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
cdb0: 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20  the total.      
cdc0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
cdd0: 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74  ytes in fragment
cde0: 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64  s may not exceed
cdf0: 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   60. */.        
ce00: 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  if( aData[hdr+7]
ce10: 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >57 ) return 0;.
ce20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
ce30: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
ce40: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
ce50: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
ce60: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
ce70: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
ce80: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
ce90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
cea0: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
ceb0: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
ced0: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
cee0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cef0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
cf00: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
cf10: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
cf20: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
cf30: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
cf40: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
cf50: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
cf60: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
cf70: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62  */.        put2b
cf80: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
cf90: 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , x);.      }.  
cfa0: 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74      return &aDat
cfb0: 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d  a[pc + x];.    }
cfc0: 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b  .    iAddr = pc;
cfd0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
cfe0: 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a  te(&aData[pc]);.
cff0: 20 20 20 20 69 66 28 20 70 63 3c 69 41 64 64 72      if( pc<iAddr
d000: 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b 0a 20  +size ) break;. 
d010: 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b 0a 20   }.  if( pc ){. 
d020: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
d030: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
d040: 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
d050: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
d060: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
d070: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
d080: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
d090: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
d0a0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
d0b0: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
d0c0: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
d0d0: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
d0e0: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
d0f0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
d100: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
d110: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
d120: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
d130: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
d140: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
d150: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
d160: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
d170: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
d180: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
d190: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
d1a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
d1b0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
d1c0: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
d1d0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
d1e0: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
d1f0: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
d200: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
d210: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
d220: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
d230: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
d240: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
d250: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
d260: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
d270: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
d280: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
d290: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
d2a0: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
d2b0: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
d2c0: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
d2d0: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
d2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d2f0: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
d300: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
d310: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
d320: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
d330: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
d340: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
d350: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
d360: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
d370: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
d380: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
d390: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
d3a0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d3b0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
d3c0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d3f0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
d400: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
d410: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d430: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
d440: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
d450: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
d460: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
d470: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
d480: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
d490: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
d4a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d4b0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
d4c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
d4d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d4e0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
d4f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d500: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d510: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
d520: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
d530: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
d540: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
d550: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d560: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d580: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
d590: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
d5a0: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
d5b0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d5c0: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
d5d0: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
d5e0: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
d5f0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
d600: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
d610: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
d620: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
d630: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
d640: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
d650: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
d660: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
d670: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
d680: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
d690: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
d6a0: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
d6b0: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
d6c0: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
d6d0: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
d6e0: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
d6f0: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
d700: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
d710: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
d720: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
d730: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
d740: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
d750: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
d760: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
d770: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
d780: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
d790: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
d7a0: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
d7b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d7c0: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  ]);.  assert( to
d7d0: 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  p<=(int)pPage->p
d7e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d7f0: 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20  ; /* Prevent by 
d800: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29  getAndInitPage()
d810: 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f   */.  if( gap>to
d820: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70  p ){.    if( top
d830: 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42  ==0 && pPage->pB
d840: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36  t->usableSize==6
d850: 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f  5536 ){.      to
d860: 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d  p = 65536;.    }
d870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
d880: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d890: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
d8a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
d8b0: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
d8c0: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
d8d0: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
d8e0: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
d8f0: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
d900: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
d910: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
d920: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
d930: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
d940: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
d950: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
d960: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
d970: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
d980: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
d990: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
d9a0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
d9b0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
d9c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d9d0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
d9e0: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
d9f0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
da00: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
da10: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
da20: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
da30: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
da40: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
da50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
da60: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
da70: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
da80: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
da90: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
daa0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
dab0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dac0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
dad0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
dae0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
daf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
db00: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
db10: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
db20: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
db30: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
db40: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
db50: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
db60: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
db70: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
db80: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
db90: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
dba0: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
dbb0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
dbc0: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
dbd0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
dbe0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
dbf0: 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e  , MIN(4, pPage->
dc00: 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65  nFree - (2+nByte
dc10: 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
dc20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
dc30: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
dc40: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
dc50: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
dc60: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74  ( gap+2+nByte<=t
dc70: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
dc80: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
dc90: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
dca0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
dcb0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
dcc0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
dcd0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
dce0: 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61   The btreeInitPa
dcf0: 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c  ge() call has al
dd00: 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64  ready.  ** valid
dd10: 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  ated the freelis
dd20: 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74  t.  Given that t
dd30: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76  he freelist is v
dd40: 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a  alid, there.  **
dd50: 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
dd60: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  the allocation c
dd70: 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68  an extend off th
dd80: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
dd90: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65  e..  ** The asse
dda0: 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66  rt() below verif
ddb0: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
ddc0: 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a   sentence..  */.
ddd0: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
dde0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ddf0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
de00: 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79   assert( top+nBy
de10: 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  te <= (int)pPage
de20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
de30: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
de40: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
de50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
de60: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
de70: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
de80: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
de90: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
dea0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
deb0: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
dec0: 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  s pPage->aData[i
ded0: 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  Start].** and th
dee0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
def0: 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74  ock is iSize byt
df00: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65  es..**.** Adjace
df10: 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72  nt freeblocks ar
df20: 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a  e coalesced..**.
df30: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65  ** Note that eve
df40: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
df50: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
df60: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
df70: 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74  InitPage(),.** t
df80: 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  hat routine will
df90: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
dfa0: 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  lap between cell
dfb0: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e  s or freeblocks.
dfc0: 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74    Nor.** does it
dfd0: 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72   detect cells or
dfe0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
dff0: 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74   encrouch into t
e000: 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65  he reserved byte
e010: 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
e020: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f  of the page.  So
e030: 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   do additional c
e040: 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73  orruption checks
e050: 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20   inside this.** 
e060: 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75  routine and retu
e070: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e080: 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d  T if any problem
e090: 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  s are found..*/.
e0a0: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
e0b0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
e0c0: 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c  age, u16 iStart,
e0d0: 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75   u16 iSize){.  u
e0e0: 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20  16 iPtr;        
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e110: 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66  of ptr to next f
e120: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31  reeblock */.  u1
e130: 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20  6 iFreeBlk;     
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e160: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
e170: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72  lock */.  u8 hdr
e180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73  /* Page header s
e1b0: 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a  ize.  0 or 100 *
e1c0: 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30  /.  u8 nFrag = 0
e1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64            /* Red
e1f0: 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65  uction in fragme
e200: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36  ntation */.  u16
e210: 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69   iOrigSize = iSi
e220: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
e230: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
e240: 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f  alue of iSize */
e250: 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20 20 20  .  u16 x;       
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
e280: 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
e290: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33 32  nt area */.  u32
e2a0: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
e2b0: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
e2c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
e2d0: 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74   past the iStart
e2e0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73   buffer */.  uns
e2f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
e300: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
e310: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65     /* Page conte
e320: 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
e330: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
e340: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e350: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
e360: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
e370: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
e380: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
e390: 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  Start>=pPage->hd
e3a0: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
e3b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
e3c0: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e3d0: 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d  PT_DB || iEnd <=
e3e0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
e3f0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
e400: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e410: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
e420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e430: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
e440: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
e450: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
e460: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
e470: 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  art<=pPage->pBt-
e480: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
e490: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
e4a0: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
e4b0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
e4c0: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
e4d0: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
e4e0: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
e4f0: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
e500: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
e510: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
e520: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
e530: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
e540: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
e550: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
e560: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
e570: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
e580: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
e590: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
e5a0: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
e5b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
e5c0: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
e5d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e5e0: 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29  iPtr]))<iStart )
e5f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  {.      if( iFre
e600: 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20  eBlk<iPtr+4 ){. 
e610: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
e620: 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Blk==0 ) break;.
e630: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e640: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e650: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
e660: 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20   }.      iPtr = 
e670: 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a  iFreeBlk;.    }.
e680: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e690: 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
e6a0: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
e6b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e6c0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
e6d0: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
e6e0: 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b  assert( iFreeBlk
e6f0: 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c  >iPtr || iFreeBl
e700: 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f  k==0 );.  .    /
e710: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a  * At this point:
e720: 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65  .    **    iFree
e730: 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65  Blk:   First fre
e740: 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74  eblock after iSt
e750: 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  art, or zero if 
e760: 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69  none.    **    i
e770: 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61  Ptr:       The a
e780: 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e  ddress of a poin
e790: 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a  ter to iFreeBlk.
e7a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68      **.    ** Ch
e7b0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46  eck to see if iF
e7c0: 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65  reeBlk should be
e7d0: 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20   coalesced onto 
e7e0: 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72  the end of iStar
e7f0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
e800: 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45  ( iFreeBlk && iE
e810: 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29  nd+3>=iFreeBlk )
e820: 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20  {.      nFrag = 
e830: 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b  iFreeBlk - iEnd;
e840: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e  .      if( iEnd>
e850: 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72  iFreeBlk ) retur
e860: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e870: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
e880: 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65      iEnd = iFree
e890: 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26  Blk + get2byte(&
e8a0: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d  data[iFreeBlk+2]
e8b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  );.      if( iEn
e8c0: 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  d > pPage->pBt->
e8d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e8e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e8f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
e900: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
e910: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
e920: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
e930: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
e940: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
e950: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
e960: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
e970: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
e980: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
e990: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
e9a0: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
e9b0: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
e9c0: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
e9d0: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
e9e0: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
e9f0: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
ea00: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
ea10: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
ea20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
ea30: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
ea40: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
ea50: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
ea60: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
ea70: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
ea80: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
ea90: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
eaa0: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
eab0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
eac0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
ead0: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
eae0: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
eaf0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
eb00: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
eb10: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
eb20: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
eb30: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
eb40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
eb50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
eb60: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
eb70: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
eb80: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
eb90: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
eba0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
ebb0: 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29 7b 0a  f( iStart<=x ){.
ebc0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
ebd0: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
ebe0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
ebf0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ec00: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
ec10: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
ec20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ec30: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
ec40: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
ec50: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
ec60: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
ec70: 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74 72 21  Start<x || iPtr!
ec80: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
ec90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
eca0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
ecb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ecc0: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
ecd0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
ece0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
ecf0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
ed00: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
ed10: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
ed20: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
ed30: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
ed40: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
ed50: 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rt);.  }.  if( p
ed60: 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  Page->pBt->btsFl
ed70: 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
ed80: 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ECURE ){.    /* 
ed90: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
eda0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
edb0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
edc0: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
edd0: 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73      ** option is
ede0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20   enabled */.    
edf0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
ee00: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
ee10: 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
ee20: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69  &data[iStart], i
ee30: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74 32  FreeBlk);.  put2
ee40: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
ee50: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
ee60: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
ee70: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
ee80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ee90: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
eea0: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
eeb0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
eec0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
eed0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
eee0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
eef0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
ef00: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
ef10: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
ef20: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
ef30: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
ef40: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
ef50: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
ef60: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
ef70: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
ef80: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
ef90: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
efa0: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
efb0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
efc0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
efd0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
efe0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
eff0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
f000: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
f010: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
f020: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
f030: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
f040: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
f050: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f060: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
f070: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
f080: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
f090: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
f0a0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
f0b0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
f0c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f0d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
f0e0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
f0f0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
f100: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
f110: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
f120: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
f130: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
f140: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
f150: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
f160: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
f170: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
f180: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
f190: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
f1a0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
f1b0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
f1c0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
f1d0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
f1e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
f1f0: 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75  291-35328 A valu
f200: 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65  e of 5 (0x05) me
f210: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
f220: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
f230: 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  or table b-tree 
f240: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
f250: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
f260: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
f270: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
f280: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30  ENCE-OF: R-26900
f290: 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f  -09176 A value o
f2a0: 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e  f 13 (0x0d) mean
f2b0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
f2c0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c      ** leaf tabl
f2d0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
f2e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f2f0: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
f300: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
f310: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
f320: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
f330: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
f340: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
f350: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
f360: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
f370: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
f380: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a  eeParseCellPtr;.
f390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3a0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
f3b0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  af = 0;.      pP
f3c0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
f3d0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
f3e0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
f3f0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f400: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f410: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
f420: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
f430: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
f440: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
f450: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f460: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
f470: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
f480: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
f490: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f4a0: 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33  -OF: R-43316-373
f4b0: 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  08 A value of 2 
f4c0: 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65  (0x02) means the
f4d0: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
f4e0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65  ** interior inde
f4f0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f500: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f510: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
f520: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
f530: 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34  CE-OF: R-59615-4
f540: 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  2828 A value of 
f550: 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20  10 (0x0a) means 
f560: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
f570: 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20    ** leaf index 
f580: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
f590: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
f5a0: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
f5b0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
f5c0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
f5d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f5e0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
f5f0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
f600: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
f610: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
f620: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f630: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
f640: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
f650: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
f660: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
f670: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f680: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
f690: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
f6a0: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
f6b0: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
f6c0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
f6d0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
f6e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
f6f0: 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  (pPage);.  }.  p
f700: 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
f710: 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78  yload = pBt->max
f720: 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20  1bytePayload;.  
f730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
f750: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
f760: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
f770: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
f780: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
f790: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
f7a0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
f7b0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
f7c0: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
f7d0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
f7e0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
f7f0: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
f800: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
f810: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
f820: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
f830: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
f840: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
f850: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
f860: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
f870: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
f880: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
f890: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
f8a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
f8b0: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
f8c0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
f8d0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
f8e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
f8f0: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
f900: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
f910: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
f920: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f930: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
f940: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
f950: 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
f960: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
f970: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
f980: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
f990: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
f9a0: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
f9b0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
f9c0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
f9d0: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
f9e0: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
f9f0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 63   page */.  u16 c
fa00: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
fa10: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
fa20: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
fa30: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
fa40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
fa50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fa60: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
fa70: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
fa80: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
fa90: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
faa0: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
fab0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
fac0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
fad0: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
fae0: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
faf0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
fb00: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
fb10: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
fb20: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
fb30: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
fb40: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
fb50: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
fb60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fb70: 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29  ge->pBt->db!=0 )
fb80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fb90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fba0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
fbb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
fbc0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
fbd0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
fbe0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
fbf0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
fc00: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
fc10: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
fc20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
fc30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
fc40: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
fc50: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
fc60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fc70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
fc80: 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  e->isInit==0 );.
fc90: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
fca0: 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  pBt;.  hdr = pPa
fcb0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
fcc0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
fcd0: 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45  Data;.  /* EVIDE
fce0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
fcf0: 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
fd00: 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
fd10: 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
fd20: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
fd30: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69  age type. */.  i
fd40: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
fd50: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
fd60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
fd80: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
fd90: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
fda0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
fdb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
fdc0: 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
fdd0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
fde0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
fdf0: 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f   1);.  pPage->nO
fe00: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75  verflow = 0;.  u
fe10: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
fe20: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
fe30: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
fe40: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
fe50: 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d  hdr + 8 + pPage-
fe60: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
fe70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
fe80: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
fe90: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
fea0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
feb0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70  cellOffset];.  p
fec0: 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
fed0: 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
fee0: 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
fef0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
ff00: 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
ff10: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
ff20: 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
ff30: 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74  esignates.  ** t
ff40: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
ff50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
ff60: 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20  a. A zero value 
ff70: 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72  for this integer
ff80: 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72   is.  ** interpr
ff90: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ffa0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
ffb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
ffc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56  hdr+5]);.  /* EV
ffd0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
ffe0: 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
fff0: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
10000 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
10010 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
10020 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
10030 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65  page. */.  pPage
10040 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
10050 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
10060 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
10070 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
10080 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d  ) ){.    /* To m
10090 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
100a0 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
100b0 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
100c0 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
100d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
100e0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
100f0 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
10100 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
10110 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
10120 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10130 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
10140 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
10150 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
10160 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70  h is only.  ** p
10170 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f  ossible for a ro
10180 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot page of a tab
10190 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
101a0 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74   no rows) then t
101b0 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74  he.  ** offset t
101c0 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
101d0 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75  nt area will equ
101e0 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  al the page size
101f0 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20   minus the.  ** 
10200 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65  bytes of reserve
10210 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73  d space. */.  as
10220 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
10230 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
10240 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
10250 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41  PT_DB );..  /* A
10260 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
10270 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
10280 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20  ause us to read 
10290 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  past the end.  *
102a0 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
102b0 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
102c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
102d0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
102e0 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
102f0 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
10300 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a  cell extends.  *
10310 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
10320 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  f a page boundar
10330 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c  y and causes SQL
10340 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62  ITE_CORRUPT to b
10350 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  e .  ** returned
10360 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   if it does..  *
10370 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  /.  iCellFirst =
10380 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
10390 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
103a0 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
103b0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66  leSize - 4;.  if
103c0 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
103d0 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
103e0 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  zeCk ){.    int 
103f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
10400 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
10410 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
10420 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ay */.    int sz
10430 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
10440 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
10450 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
10460 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
10470 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  st--;.    for(i=
10480 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
10490 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
104a0 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
104b0 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
104c0 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
104d0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
104e0 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
104f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10500 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
10510 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
10520 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
10530 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10550 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10560 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
10570 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
10580 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
10590 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
105a0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
105b0 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
105c0 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a  .      if( pc+sz
105d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
105e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
105f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10600 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10610 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10620 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
10630 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20  CellLast++;.  } 
10640 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20   ..  /* Compute 
10650 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
10660 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
10670 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  ** EVIDENCE-O
10680 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
10690 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
106a0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
106b0 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  1 gives the.  **
106c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
106d0 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
106e0 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
106f0 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
10700 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62  re no.  ** freeb
10710 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d  locks. */.  pc =
10720 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10730 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
10740 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
10750 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e   top;  /* Init n
10760 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65  Free to non-free
10770 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65  block free space
10780 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29   */.  if( pc>0 )
10790 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20  {.    u32 next, 
107a0 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
107b0 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20  <iCellFirst ){. 
107c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
107d0 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
107e0 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
107f0 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
10800 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
10810 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
10820 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
10830 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
10840 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
10850 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
10860 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10870 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20 0a  T_PAGE(pPage); .
10880 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
10890 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   1 ){.      if( 
108a0 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
108b0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62          /* Freeb
108c0 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64  lock off the end
108d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
108e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
108f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10900 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
10910 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
10920 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
10930 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
10940 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10950 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e  [pc+2]);.      n
10960 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
10970 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
10980 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
10990 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63   break;.      pc
109a0 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
109b0 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b     if( next>0 ){
109c0 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c  .      /* Freebl
109d0 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e  ock not in ascen
109e0 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
109f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10a00 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10a10 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
10a20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e   if( pc+size>(un
10a30 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c  signed int)usabl
10a40 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
10a50 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b  * Last freeblock
10a60 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70 61   extends past pa
10a70 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20  ge end */.      
10a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10a90 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10ab0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
10ac0 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
10ad0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10ae0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
10af0 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
10b00 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10b10 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
10b20 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
10b30 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
10b40 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10b50 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
10b60 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
10b70 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20  sable-size.  ** 
10b80 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
10b90 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
10ba0 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
10bb0 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
10bc0 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
10bd0 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
10be0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
10bf0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
10c00 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20  tent.  ** area, 
10c10 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
10c20 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
10c30 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
10c40 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ge..  */.  if( n
10c50 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
10c60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10c70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10c80 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
10c90 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
10ca0 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
10cb0 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61 67  llFirst);.  pPag
10cc0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
10cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10ce0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
10cf0 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
10d00 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
10d10 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
10d20 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
10d30 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
10d40 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
10d50 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
10d60 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
10d70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10d80 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
10d90 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
10da0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
10db0 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
10dc0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
10dd0 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
10de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
10df0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
10e00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
10e10 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
10e20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10e30 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
10e40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
10e50 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
10e60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10e70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
10e80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
10e90 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
10ea0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
10eb0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
10ec0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
10ed0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10ee0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10ef0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
10f00 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
10f10 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
10f20 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
10f30 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
10f40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10f50 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
10f60 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
10f70 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
10f80 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
10f90 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
10fa0 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
10fb0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
10fc0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
10fd0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
10fe0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
10ff0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
11000 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
11010 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
11020 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
11030 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
11040 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
11050 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
11060 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
11070 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
11080 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
11090 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
110a0 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
110b0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
110c0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
110d0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
110e0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
110f0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
11100 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
11110 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
11120 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
11130 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
11140 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
11150 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
11160 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
11170 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
11180 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
11190 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
111a0 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
111b0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
111c0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
111d0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
111e0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
111f0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
11200 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
11210 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
11220 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
11230 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
11240 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
11250 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
11260 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11270 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
11280 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65   if( pgno!=pPage
11290 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
112a0 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
112b0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
112c0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70  (pDbPage);.    p
112d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
112e0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61  pDbPage;.    pPa
112f0 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
11300 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
11310 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65   pgno;.    pPage
11320 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
11330 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
11340 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
11350 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  Page->aData==sql
11360 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11370 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  (pDbPage) );.  r
11380 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
11390 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
113a0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
113b0 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
113c0 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
113d0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
113e0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
113f0 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f  eeded.  See also
11400 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  : btreeGetUnused
11410 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
11420 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
11430 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73  OCONTENT flag is
11440 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
11450 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
11460 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  re.** about the 
11470 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
11480 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
11490 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
114a0 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
114b0 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
114c0 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
114d0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
114e0 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
114f0 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
11500 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
11510 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
11520 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
11530 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
11540 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
11550 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
11560 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
11570 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
11580 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
11590 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
115a0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
115b0 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
115c0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
115d0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
115e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
115f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11600 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
11610 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
11620 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
11630 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
11640 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
11650 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
11660 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
11670 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
11680 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
11690 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
116a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
116b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
116c0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
116d0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
116e0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
116f0 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
11700 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
11710 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11720 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11730 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11740 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11750 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
11760 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
11770 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
11780 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
11790 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
117a0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
117b0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
117c0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
117d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
117e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
117f0 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
11800 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11810 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
11820 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
11830 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
11840 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
11850 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
11860 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
11870 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
11880 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
11890 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
118a0 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
118b0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
118c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
118d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
118e0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
118f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11900 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11910 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
11920 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
11930 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
11940 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
11950 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
11960 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
11970 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
11980 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
11990 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
119a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
119b0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
119c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
119d0 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
119e0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
119f0 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
11a00 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
11a10 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
11a20 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
11a30 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
11a40 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
11a50 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
11a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
11a70 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
11a80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11a90 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
11aa0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
11ab0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
11ac0 65 29 26 30 78 38 30 30 30 30 30 30 30 29 3d 3d  e)&0x80000000)==
11ad0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74  0 );.  return bt
11ae0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
11af0 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
11b00 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
11b10 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
11b20 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a  tialize it..**.*
11b30 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65  * If pCur!=0 the
11b40 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
11b50 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70  ing fetched as p
11b60 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43  art of a moveToC
11b70 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20  hild().** call. 
11b80 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73   Do additional s
11b90 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
11ba0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
11bb0 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20  is case..** And 
11bc0 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69  if the fetch fai
11bd0 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ls, this routine
11be0 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20   must decrement 
11bf0 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a  pCur->iPage..**.
11c00 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66  ** The page is f
11c10 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77  etched as read-w
11c20 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72  rite unless pCur
11c30 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
11c40 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e   is.** a read-on
11c50 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ly cursor..**.**
11c60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11c70 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  urs, then *ppPag
11c80 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
11c90 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
11ca0 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
11cb0 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
11cc0 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
11cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11ce0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
11cf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
11d20 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
11d30 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
11d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11d50 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
11d60 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
11d70 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d90 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
11da0 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
11db0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
11dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
11de0 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c  eceive the page,
11df0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
11e00 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20  t bReadOnly     
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e20 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
11e30 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b  -only page */.){
11e40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
11e50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11e60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11e70 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11e80 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11e90 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11ea0 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50  pPage==&pCur->pP
11eb0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
11ec0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61   pCur==0 || bRea
11ed0 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72  dOnly==pCur->cur
11ee0 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20  PagerFlags );.  
11ef0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
11f00 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  || pCur->iPage>0
11f10 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
11f20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11f30 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
11f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11f50 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  KPT;.    goto ge
11f60 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11f70 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  or;.  }.  rc = s
11f80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
11f90 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
11fa0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
11fb0 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29  Page, bReadOnly)
11fc0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
11fd0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11fe0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11ff0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65  .  *ppPage = (Me
12000 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
12010 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
12020 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70  age);.  if( (*pp
12030 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
12040 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67   ){.    btreePag
12050 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12060 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12070 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
12080 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
12090 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
120a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
120b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
120c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Page);.      got
120d0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
120e0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
120f0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
12100 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
12110 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
12120 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d  *ppPage)->aData=
12130 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
12140 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
12150 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e  ..  /* If obtain
12160 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67 65  ing a child page
12170 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77   for a cursor, w
12180 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68  e must verify th
12190 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  at the page is. 
121a0 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   ** compatible w
121b0 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ith the root pag
121c0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  e. */.  if( pCur
121d0 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e   && ((*ppPage)->
121e0 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50  nCell<1 || (*ppP
121f0 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  age)->intKey!=pC
12200 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29  ur->curIntKey) )
12210 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12220 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
12230 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  gno);.    releas
12240 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12250 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12260 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12270 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12280 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
12290 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
122a0 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
122b0 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
122c0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
122d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
122e0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a  ur->iPage];.  }.
122f0 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
12300 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
12310 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
12320 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
12330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12340 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
12350 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
12360 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
12370 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
12380 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
12390 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
123a0 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20  *.** Page1 is a 
123b0 73 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64  special case and
123c0 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
123d0 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50  d using releaseP
123e0 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61  ageOne()..*/.sta
123f0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
12400 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
12410 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
12420 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
12430 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12440 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
12450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12460 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
12470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12480 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
12490 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
124a0 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
124b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
124c0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
124d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
124e0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
124f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12500 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12510 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12520 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
12530 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
12540 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
12550 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
12560 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
12570 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
12580 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
12590 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
125a0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
125b0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d  releasePageOne(M
125c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
125d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
125e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
125f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
12600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12610 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
12620 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
12630 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12640 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
12650 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
12660 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
12670 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
12680 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12690 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
126a0 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
126b0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
126c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
126d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
126e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
126f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61  ite3PagerUnrefPa
12700 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62  geOne(pPage->pDb
12710 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
12720 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
12730 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
12740 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
12750 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
12760 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
12770 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
12780 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
12790 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
127a0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
127b0 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
127c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
127d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
127e0 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
127f0 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
12800 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
12810 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
12820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12830 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
12840 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
12850 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
12860 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
12870 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
12880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
12890 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
128a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
128b0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
128c0 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
128d0 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
128e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
128f0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
12900 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
12910 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
12920 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
12930 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
12940 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
12950 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
12960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12970 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
12980 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
12990 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
129a0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
129b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
129c0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
129d0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
129e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
129f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
12a00 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
12a10 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
12a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
12a30 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
12a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
12a50 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
12a60 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
12a70 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
12a80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
12a90 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
12aa0 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
12ab0 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
12ac0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
12ad0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
12ae0 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
12af0 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
12b00 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
12b10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12b20 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
12b30 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
12b40 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
12b50 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
12b60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
12b70 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
12b80 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
12b90 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
12ba0 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
12bb0 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
12bc0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
12bd0 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
12be0 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
12bf0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
12c00 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
12c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12c20 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
12c30 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
12c40 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
12c50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12c60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12c70 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12c80 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
12c90 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
12ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12cb0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
12cc0 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
12cd0 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
12ce0 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
12cf0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
12d00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
12d10 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
12d20 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
12d30 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
12d40 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
12d50 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
12d60 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
12d70 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
12d80 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
12d90 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
12da0 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
12db0 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
12dc0 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
12dd0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
12de0 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
12df0 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
12e00 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
12e10 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
12e20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
12e30 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
12e40 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
12e50 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
12e60 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
12e70 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
12e80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12e90 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
12ea0 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
12eb0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
12ec0 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
12ed0 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
12ee0 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
12ef0 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
12f00 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
12f10 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
12f20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12f30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12f40 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
12f50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12f60 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
12f70 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
12f80 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20  Handler,.       
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12fb0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
12fc0 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a  >pPager));.}../*
12fd0 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
12fe0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
12ff0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
13000 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
13010 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
13020 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
13030 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
13040 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13050 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
13060 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
13070 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
13080 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
13090 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
130a0 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
130b0 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
130c0 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
130d0 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
130e0 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
130f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13100 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
13110 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
13120 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
13130 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
13140 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
13150 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
13160 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
13170 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
13180 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13190 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
131a0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
131b0 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
131c0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
131d0 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
131e0 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
131f0 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
13200 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
13210 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
13220 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
13230 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
13240 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
13250 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13260 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
13270 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
13280 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
13290 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
132a0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
132b0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
132c0 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
132d0 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
132e0 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
132f0 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
13300 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13310 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
13320 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
13330 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
13340 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
13350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
13360 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
13370 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
13380 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
13390 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
133a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
133b0 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
133c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
133d0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
133e0 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
133f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
13400 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
13410 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
13420 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
13430 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
13440 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13450 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
13460 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
13470 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13490 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
134a0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
134b0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
134c0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
134d0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
134e0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
134f0 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
13500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
13510 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
13520 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
13530 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
13560 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
13570 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
13580 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
13590 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
135a0 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
135b0 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
135c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
135d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
135e0 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
135f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
13600 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13620 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
13630 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
13640 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
13650 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
13660 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
13670 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
13680 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
13690 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
136a0 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
136b0 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
136c0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
136d0 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
136e0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
136f0 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
13700 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
13710 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
13720 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
13730 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
13740 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
13750 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
13760 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
13770 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
13780 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
13790 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
137a0 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
137b0 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
137c0 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
137d0 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
137e0 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
13810 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
13820 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
13850 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
13860 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
13870 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
13880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
13890 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
138a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
138b0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
138c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
138d0 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
138e0 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
138f0 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
13900 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
13910 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
13920 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
13930 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
13940 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
13950 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
13960 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
13970 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
13980 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
13990 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
139a0 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
139b0 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
139c0 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
139d0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
139e0 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
139f0 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
13a00 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
13a10 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
13a20 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
13a30 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
13a40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
13a50 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
13a60 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
13a70 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
13a80 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
13a90 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
13aa0 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
13ab0 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
13ac0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
13ad0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
13ae0 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
13af0 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
13b00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
13b10 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  T;.  }.  p->inTr
13b20 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
13b30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
13b40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
13b60 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
13b70 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
13b80 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
13b90 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
13ba0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
13bb0 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
13bc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13bd0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
13be0 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
13bf0 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
13c00 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
13c10 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
13c20 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
13c30 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
13c40 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
13c50 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
13c60 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
13c70 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
13c80 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
13c90 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
13ca0 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
13cb0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13cc0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
13cd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
13ce0 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
13cf0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
13d00 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
13d10 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
13d20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13d30 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
13d40 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
13d50 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
13d60 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
13d70 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
13d80 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
13d90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
13da0 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
13db0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
13dc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
13dd0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
13de0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13df0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
13e00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13e10 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13e20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
13e30 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
13e40 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
13e50 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
13e60 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
13e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13e80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13e90 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
13ea0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
13ee0 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
13ef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13f10 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
13f20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
13f30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13f40 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
13f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13f60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
13f70 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
13f80 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
13f90 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
13fa0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
13fb0 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
13fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13fd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13fe0 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
13ff0 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
14000 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14010 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14020 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
14030 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14040 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
14050 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
14060 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
14070 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14080 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14090 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
140a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
140b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
140c0 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
140d0 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
140e0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
140f0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
14100 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
14110 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14120 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
14130 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
14140 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
14150 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
14160 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
14170 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
14180 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
14190 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
141a0 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
141b0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
141c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
141d0 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
141e0 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
141f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14210 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14230 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14240 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14260 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
14270 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
14280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14290 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
142a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
142b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
142c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
142d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
142e0 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
142f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
14300 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
14310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14320 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14330 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14340 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
14350 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
14360 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
14370 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
14380 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
14390 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
143a0 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
143b0 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
143c0 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
143d0 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
143e0 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
143f0 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
14400 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
14410 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
14420 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
14430 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
14440 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
14450 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
14460 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
14470 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
14480 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
14490 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
144a0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
144b0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
144c0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
144d0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
144e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
144f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
14500 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
14510 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
14520 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
14530 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
14540 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
14550 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
14560 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
14570 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
14580 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
14590 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
145a0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
145b0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
145c0 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
145d0 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
145e0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
145f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14600 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
14610 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14620 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
14630 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14640 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
14650 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
14660 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
14670 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
14680 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
14690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
146a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
146b0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
146c0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
146d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
146e0 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
146f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
14700 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65    sizeof(MemPage
14730 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  ), flags, vfsFla
14740 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
14750 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14770 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
14780 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
14790 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
147a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
147b0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
147c0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
147d0 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
147e0 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
147f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14810 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
14820 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
14830 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
14840 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
14850 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
14860 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
14870 50 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64  PagerSetBusyHand
14880 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
14890 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
148a0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
148b0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
148c0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
148d0 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
148e0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
148f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
14900 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
14910 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
14920 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
14930 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
14940 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14950 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
14960 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14970 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
14980 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66  ELETE;.#elif def
14990 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54  ined(SQLITE_FAST
149a0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
149b0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
149c0 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49  s |= BTS_OVERWRI
149d0 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
149e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
149f0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
14a00 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
14a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14a20 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
14a30 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
14a40 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
14a50 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
14a60 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
14a70 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
14a80 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
14a90 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
14aa0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
14ab0 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
14ac0 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
14ad0 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
14ae0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
14af0 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
14b00 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
14b10 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
14b20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
14b30 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
14b40 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
14b50 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
14b60 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
14b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14b80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
14b90 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
14ba0 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
14bb0 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
14bc0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
14bd0 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
14be0 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
14bf0 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
14c00 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
14c10 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
14c20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
14c30 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
14c40 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
14c50 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
14c60 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
14c70 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
14c80 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
14c90 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
14ca0 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
14cb0 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
14cc0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
14cd0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
14ce0 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
14cf0 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
14d00 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
14d10 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
14d20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
14d30 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
14d40 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
14d50 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
14d60 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
14d70 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
14d80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
14d90 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
14da0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
14db0 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
14dc0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
14dd0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
14de0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
14df0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
14e00 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
14e10 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
14e20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
14e30 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
14e40 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
14e50 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
14e60 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
14e70 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
14e80 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
14e90 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
14ea0 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
14eb0 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
14ec0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
14ed0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
14ee0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ef0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14f00 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
14f10 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14f20 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
14f30 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
14f40 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14f50 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
14f60 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
14f70 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
14f80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
14f90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
14fa0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
14fb0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
14fc0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
14fd0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
14fe0 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14ff0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
15000 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
15010 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
15020 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
15030 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
15040 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
15050 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
15060 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
15070 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
15080 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15090 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
150a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
150b0 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
150c0 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
150d0 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
150e0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
150f0 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
15100 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
15110 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
15120 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
15130 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
15140 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
15150 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
15160 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ).      MUTEX_LO
15170 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
15180 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15190 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
151a0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
151b0 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
151c0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
151d0 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
151e0 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
151f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
15200 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
15210 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15220 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
15230 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
15240 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
15250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15260 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
15270 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
15280 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
15290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
152a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
152b0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
152c0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
152d0 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
152e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
152f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15300 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
15310 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15320 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15330 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
15340 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15350 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
15360 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15370 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
15380 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15390 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
153a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
153b0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
153c0 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
153d0 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
153e0 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
153f0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
15400 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
15410 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
15420 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
15430 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
15440 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
15450 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
15460 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
15470 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
15480 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
15490 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
154a0 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
154b0 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
154c0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
154d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
154e0 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
154f0 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
15500 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
15510 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
15520 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
15530 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
15540 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75  }.        if( (u
15550 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72  ptr)p->pBt<(uptr
15560 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  )pSib->pBt ){.  
15570 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15580 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
15590 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
155a0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
155b0 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
155c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155d0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
155e0 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72  ->pNext && (uptr
155f0 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42  )pSib->pNext->pB
15600 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29  t<(uptr)p->pBt )
15610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
15620 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
15630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15640 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15650 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
15660 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
15670 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
15680 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
15690 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
156a0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
156b0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
156c0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
156d0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
156e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
156f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15700 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
15710 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
15720 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
15730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15740 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
15750 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
15760 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
15770 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
15780 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  ->pPager, 0);.  
15790 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
157a0 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
157b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
157c0 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
157d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
157e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
157f0 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  le;..    /* If t
15800 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
15810 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
15820 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
15830 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
15840 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
15850 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
15860 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
15870 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
15880 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
15890 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
158a0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
158b0 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
158c0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
158d0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
158e0 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
158f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
15900 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
15910 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
15920 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
15930 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20  _SIZE);.    }.. 
15940 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74     pFile = sqlit
15950 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
15960 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15970 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
15980 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
15990 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
159a0 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  int(pFile, SQLIT
159b0 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f  E_FCNTL_PDB, (vo
159c0 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20  id*)&pBt->db);. 
159d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
159e0 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
159f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15a00 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
15a10 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
15a20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15a30 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
15a40 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
15a50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
15a60 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69  te3BtreeConnecti
15a70 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65  onCount(*ppBtree
15a80 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  )>0 );.  return 
15a90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
15aa0 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
15ab0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
15ac0 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
15ad0 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
15ae0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
15af0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
15b00 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
15b10 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
15b20 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
15b30 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
15b40 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
15b50 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
15b60 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
15b70 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
15b80 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
15b90 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
15ba0 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
15bb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15bc0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
15bd0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
15be0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
15bf0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
15c00 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
15c10 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
15c20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15c30 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
15c40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
15c50 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
15c60 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
15c70 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15c80 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
15c90 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
15ca0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
15cb0 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
15cc0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
15cd0 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
15ce0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
15cf0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15d00 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
15d10 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
15d20 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15d30 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15d40 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
15d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15d60 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
15d70 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15d80 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15d90 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
15da0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
15db0 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
15dc0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
15dd0 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
15de0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
15df0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
15e00 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
15e10 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
15e20 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15e30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
15e40 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
15e50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15e60 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
15e70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
15e80 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
15e90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
15ea0 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
15eb0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
15ec0 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
15ed0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
15ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
15ef0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
15f00 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
15f10 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
15f20 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
15f30 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
15f40 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
15f50 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
15f60 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
15f70 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
15f80 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
15f90 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
15fa0 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
15fb0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
15fc0 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
15fd0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
15fe0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
15ff0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
16000 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
16010 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
16020 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
16030 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
16040 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
16050 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
16060 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
16070 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
16080 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
16090 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
160a0 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
160b0 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
160c0 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
160d0 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
160e0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
160f0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
16100 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
16110 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
16120 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
16130 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
16140 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
16150 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
16160 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
16170 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
16180 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
16190 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
161a0 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
161b0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
161c0 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
161d0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
161e0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
161f0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
16200 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
16210 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
16220 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
16230 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
16240 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
16250 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
16260 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
16270 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16280 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
16290 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
162a0 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
162b0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
162c0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
162d0 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
162e0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
162f0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
16300 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
16310 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
16320 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
16330 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
16340 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
16350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16360 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16370 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16380 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
16390 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
163a0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
163b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
163c0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
163d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
163e0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
163f0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
16400 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
16410 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
16420 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
16430 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16440 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
16450 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
16460 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
16470 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
16480 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16490 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
164a0 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
164b0 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
164c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
164d0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
164e0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
164f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16500 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
16510 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
16520 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
16530 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
16540 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
16550 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16560 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
16570 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
16580 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
16590 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
165a0 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
165b0 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
165c0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
165d0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
165e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
165f0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
16600 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16610 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
16620 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
16630 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
16640 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
16650 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
16660 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
16670 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
16680 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
16690 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
166a0 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
166b0 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
166c0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
166d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
166e0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
166f0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
16700 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16710 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
16720 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
16730 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
16740 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
16750 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
16760 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
16770 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
16780 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
16790 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
167a0 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
167b0 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
167c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
167d0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
167e0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
167f0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
16800 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
16810 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
16820 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
16830 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
16840 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
16850 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
16860 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
16870 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16880 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
16890 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
168a0 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
168b0 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
168c0 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
168d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
168e0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
168f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
16900 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
16910 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28   p->db);.    if(
16920 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
16930 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
16940 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
16950 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
16960 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
16970 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16980 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
16990 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
169a0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
169b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
169c0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
169d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
169e0 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
169f0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
16a00 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
16a10 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
16a20 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
16a30 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
16a40 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
16a50 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
16a60 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
16a70 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
16a80 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
16a90 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
16aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16ab0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
16ac0 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74  soft" limit on t
16ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
16ae0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
16af0 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75  .** Unused and u
16b00 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20  nmodified pages 
16b10 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64  will be recycled
16b20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
16b30 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20   of.** pages in 
16b40 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64  the cache exceed
16b50 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69  s this soft limi
16b60 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65  t.  But the size
16b70 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65   of the.** cache
16b80 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67   is allowed to g
16b90 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20  row larger than 
16ba0 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74  this limit if it
16bb0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72   contains.** dir
16bc0 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65  ty pages or page
16bd0 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76  s still in activ
16be0 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e use..*/.int sq
16bf0 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
16c00 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
16c10 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
16c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16c30 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
16c40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16c50 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
16c60 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
16c70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16c80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
16c90 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
16ca0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
16cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16cc0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16ce0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
16cf0 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20  spill" limit on 
16d00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16d10 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
16d20 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  ..** If the numb
16d30 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65  er of pages exce
16d40 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64  eds this limit d
16d50 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72  uring a write tr
16d60 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68  ansaction,.** th
16d70 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74  e pager might at
16d80 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22  tempt to "spill"
16d90 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f   pages to the jo
16da0 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a  urnal early in.*
16db0 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  * order to free 
16dc0 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  up memory..**.**
16dd0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
16de0 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65  ned is the curre
16df0 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20  nt spill size.  
16e00 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65  If zero is passe
16e10 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  d.** as an argum
16e20 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20  ent, no changes 
16e30 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
16e40 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69  spill size setti
16e50 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20  ng, so.** using 
16e60 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61  mxPage of 0 is a
16e70 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68   way to query th
16e80 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
16e90 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  size..*/.int sql
16ea0 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
16eb0 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  lSize(Btree *p, 
16ec0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
16ed0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16ee0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73  ->pBt;.  int res
16ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16f00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16f10 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
16f20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16f30 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20  ter(p);.  res = 
16f40 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
16f50 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50  pillsize(pBt->pP
16f60 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
16f70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16f80 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16f90 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  res;.}..#if SQLI
16fa0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
16fb0 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
16fc0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
16fd0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
16fe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
16ff0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
17000 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
17010 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17020 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
17030 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
17040 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
17050 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17060 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
17070 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17080 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
17090 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
170a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
170b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
170c0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
170d0 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
170e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
170f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
17100 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
17110 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
17120 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
17130 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17140 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
17150 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
17160 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
17170 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
17180 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
17190 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
171a0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
171b0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
171c0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
171d0 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
171e0 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
171f0 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
17200 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
17210 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
17220 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
17230 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
17240 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
17250 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
17260 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
17270 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
17280 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
17290 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
172a0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
172b0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
172c0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
172d0 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
172e0 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
172f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17300 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
17310 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17320 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
17330 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
17340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
17350 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
17360 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
17370 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
17380 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
17390 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
173a0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
173b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
173c0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
173d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
173e0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
173f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17400 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
17410 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
17420 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
17430 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
17440 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17460 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
17470 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17480 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
17490 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
174a0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
174b0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
174c0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
174d0 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
174e0 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
174f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17500 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
17510 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
17520 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
17530 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
17540 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
17550 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
17560 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
17570 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
17580 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
17590 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
175a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
175b0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
175c0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
175d0 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
175e0 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
175f0 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
17600 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
17610 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
17620 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
17630 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
17640 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
17650 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
17660 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
17670 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
17680 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
17690 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
176a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
176b0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
176c0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
176d0 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
176e0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
176f0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
17700 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
17710 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
17720 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
17730 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
17740 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
17750 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
17760 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
17770 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
17780 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
17790 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
177a0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
177b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
177c0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
177d0 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
177e0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
177f0 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
17800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17810 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17820 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17830 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
17840 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
17850 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
17860 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
17870 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17880 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
17890 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
178a0 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
178b0 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
178c0 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
178d0 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
178e0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
178f0 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
17900 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17910 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
17920 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17930 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
17940 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
17950 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
17960 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
17970 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
17980 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
17990 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
179a0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
179b0 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
179c0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
179d0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
179e0 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
179f0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
17a00 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
17a10 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
17a20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
17a30 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
17a40 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
17a50 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
17a60 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
17a70 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
17a80 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
17a90 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
17aa0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
17ab0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
17ac0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
17ad0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
17ae0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
17af0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
17b00 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
17b10 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17b20 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
17b30 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
17b40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17b50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17b60 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
17b70 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
17b80 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
17b90 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
17ba0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
17bb0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
17bc0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
17bd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17be0 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
17bf0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
17c00 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
17c10 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
17c20 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
17c30 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
17c40 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
17c50 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
17c60 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
17c70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
17c80 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
17c90 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
17ca0 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
17cb0 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
17cc0 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
17cd0 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
17ce0 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
17cf0 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
17d00 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
17d10 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
17d20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
17d30 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
17d40 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
17d50 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
17d60 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
17d70 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
17d80 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
17d90 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
17da0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
17db0 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
17dc0 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
17dd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17de0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
17df0 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
17e00 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
17e10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17e20 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
17e30 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
17e40 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
17e50 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
17e60 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
17e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17e80 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17e90 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
17ea0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
17eb0 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
17ec0 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
17ed0 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
17ee0 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
17ef0 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
17f00 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
17f10 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
17f20 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
17f30 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
17f40 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
17f50 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
17f60 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
17f70 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
17f80 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
17f90 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
17fa0 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
17fb0 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
17fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17fd0 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
17fe0 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
17ff0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
18000 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18010 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
18020 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
18030 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
18040 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
18050 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
18060 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
18070 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
18080 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
18090 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
180a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
180b0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
180c0 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
180d0 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
180e0 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
180f0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
18100 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
18110 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
18120 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
18130 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
18140 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
18150 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
18160 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
18170 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
18180 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
18190 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
181a0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
181b0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
181c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
181d0 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
181e0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
181f0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
18200 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
18210 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18220 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
18230 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
18240 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  e values for the
18250 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18260 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  TE and BTS_OVERW
18270 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  RITE flags:.**.*
18280 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20  *    newFlag==0 
18290 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53        Both BTS_S
182a0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
182b0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61   BTS_OVERWRITE a
182c0 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20  re cleared.**   
182d0 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20   newFlag==1     
182e0 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c    BTS_SECURE_DEL
182f0 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f  ETE set and BTS_
18300 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65  OVERWRITE is cle
18310 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
18320 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f  ag==2       BTS_
18330 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c  SECURE_DELETE cl
18340 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56  eared and BTS_OV
18350 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a  ERWRITE is set.*
18360 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d  *    newFlag==(-
18370 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73  1)    No changes
18380 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18390 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75  ine acts as a qu
183a0 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69  ery if newFlag i
183b0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
183c0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f  .**.** With BTS_
183d0 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64  OVERWRITE set, d
183e0 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
183f0 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  s overwritten by
18400 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66   zeros, but.** f
18410 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
18420 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74  es are not writt
18430 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
18440 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69  atabase.  Thus i
18450 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65  n-page.** delete
18460 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65  d content is cle
18470 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69  ared, but freeli
18480 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  st deleted conte
18490 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  nt is not..**.**
184a0 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45   With BTS_SECURE
184b0 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69  _DELETE, operati
184c0 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f  on is like BTS_O
184d0 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68  VERWRITE with th
184e0 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68  e addition.** th
184f0 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  at freelist leaf
18500 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
18510 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
18520 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65   database, incre
18530 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f  asing.** the amo
18540 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e  unt of disk I/O.
18550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18560 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
18570 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
18580 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
18590 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
185a0 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
185b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
185c0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f  .  assert( BTS_O
185d0 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45  VERWRITE==BTS_SE
185e0 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b  CURE_DELETE*2 );
185f0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46  .  assert( BTS_F
18600 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53  AST_SECURE==(BTS
18610 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53  _OVERWRITE|BTS_S
18620 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b  ECURE_DELETE) );
18630 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
18640 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
18650 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
18660 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20  S_FAST_SECURE;. 
18670 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
18680 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
18690 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67  E_DELETE*newFlag
186a0 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e  ;.  }.  b = (p->
186b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
186c0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29  BTS_FAST_SECURE)
186d0 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  /BTS_SECURE_DELE
186e0 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  TE;.  sqlite3Btr
186f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18700 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
18710 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
18720 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
18730 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
18740 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
18750 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
18760 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
18770 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
18780 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
18790 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
187a0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
187b0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
187c0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
187d0 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
187e0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
187f0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
18800 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
18810 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
18820 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
18830 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
18840 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
18850 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
18860 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18870 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
18880 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
18890 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
188a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
188b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
188c0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
188d0 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
188e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
188f0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
18900 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
18910 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
18920 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
18930 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
18940 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
18950 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
18960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
18970 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
18980 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
18990 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
189a0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
189b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
189c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
189d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
189e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
189f0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
18a00 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
18a10 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
18a20 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
18a30 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
18a40 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
18a50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
18a60 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
18a70 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
18a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18a90 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
18aa0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18ab0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
18ac0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
18ad0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18ae0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
18af0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
18b00 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
18b10 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
18b20 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
18b30 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
18b40 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
18b50 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
18b60 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
18b70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
18b90 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  dif.}../*.** If 
18ba0 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74  the user has not
18bb0 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d   set the safety-
18bc0 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64  level for this d
18bd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18be0 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41  on.** using "PRA
18bf0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22  GMA synchronous"
18c00 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66  , and if the saf
18c10 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74  ety-level is not
18c20 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
18c30 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
18c40 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
18c50 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f  tion as the seco
18c60 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a  nd parameter,.**
18c70 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23   set it so..*/.#
18c80 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
18c90 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
18ca0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
18cb0 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a  L_SYNCHRONOUS \.
18cc0 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28      && !defined(
18cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
18ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
18cf0 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
18d00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75  BtShared *pBt, u
18d10 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b  8 safety_level){
18d20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18d30 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28    Db *pDb;.  if(
18d40 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30   (db=pBt->db)!=0
18d50 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62   && (pDb=db->aDb
18d60 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  )!=0 ){.    whil
18d70 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c  e( pDb->pBt==0 |
18d80 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21  | pDb->pBt->pBt!
18d90 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d  =pBt ){ pDb++; }
18da0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53  .    if( pDb->bS
18db0 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20  yncSet==0 .     
18dc0 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
18dd0 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76  evel!=safety_lev
18de0 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21  el .     && pDb!
18df0 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20  =&db->aDb[1] .  
18e00 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e    ){.      pDb->
18e10 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73  safety_level = s
18e20 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20  afety_level;.   
18e30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
18e40 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
18e50 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ger,.          p
18e60 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18e70 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
18e80 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
18e90 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
18ea0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
18eb0 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
18ec0 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76  g(pBt,safety_lev
18ed0 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46  el).#endif../* F
18ee0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
18ef0 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
18f00 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
18f10 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  hared*);.../*.**
18f20 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
18f30 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
18f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18f50 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
18f60 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
18f70 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
18f80 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
18f90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18fa0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
18fb0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
18fc0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
18fd0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
18fe0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
18ff0 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
19000 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
19010 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19020 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
19030 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
19040 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
19050 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
19060 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
19070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
19080 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
19090 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
190b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
190c0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
190d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
190e0 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
190f0 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
19100 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
19110 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
19120 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19130 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
19140 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
19150 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
19160 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19170 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
19180 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
19190 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
191a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
191b0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
191c0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
191d0 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
191e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
191f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19200 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
19210 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
19220 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
19230 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
19240 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
19250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19260 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19270 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
19280 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
19290 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
192a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
192b0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
192c0 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
192d0 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
192e0 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
192f0 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
19300 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
19310 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
19320 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
19330 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
19340 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
19350 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
19360 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
19370 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
19380 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
19390 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
193a0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
193b0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
193c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
193d0 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
193e0 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
193f0 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62  }.  if( (pBt->db
19400 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
19410 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29 21  _ResetDatabase)!
19420 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
19430 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
19440 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
19450 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
19460 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
19470 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
19480 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
19490 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
194a0 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
194b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
194c0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
194d0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
194e0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
194f0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
19500 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
19510 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
19520 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
19530 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
19540 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
19550 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
19560 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
19570 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
19580 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
19590 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
195a0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
195b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
195c0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
195d0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
195e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
195f0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
19600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
19610 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
19620 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19630 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19640 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
19650 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
19660 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
19670 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
19680 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
19690 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
196a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
196b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
196c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
196d0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
196e0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
196f0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
19700 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
19710 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
19720 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
19730 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
19740 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
19750 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
19760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
19770 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
19780 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
19790 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
197a0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
197b0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
197c0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
197d0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
197e0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
197f0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
19800 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
19810 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
19820 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
19830 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
19840 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
19850 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
19860 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
19870 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
19880 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
19890 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
198a0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
198b0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
198c0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
198d0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
198e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
198f0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
19900 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
19910 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19930 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
19940 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
19950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19960 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
19970 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
19980 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
19990 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
199a0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
199b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
199c0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
199d0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
199e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
199f0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
19a00 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
19a10 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
19a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19a30 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
19a40 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
19a50 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
19a60 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  US+1);.    }.#en
19a70 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
19a80 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
19a90 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
19aa0 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
19ab0 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
19ac0 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
19ad0 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
19ae0 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
19af0 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
19b00 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
19b10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
19b20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
19b30 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
19b40 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
19b50 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
19b60 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
19b70 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
19b80 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
19b90 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
19ba0 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
19bb0 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
19bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
19bd0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
19be0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
19bf0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19c00 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
19c10 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
19c20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19c30 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
19c40 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
19c50 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
19c60 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
19c70 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
19c80 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
19c90 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
19ca0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
19cb0 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
19cc0 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
19cd0 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
19ce0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19cf0 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
19d00 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
19d10 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
19d20 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
19d30 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
19d40 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
19d50 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
19d60 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
19d70 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
19d80 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
19d90 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
19da0 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
19db0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
19dc0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
19dd0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
19de0 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
19df0 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
19e00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19e10 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
19e20 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
19e30 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
19e40 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
19e50 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
19e60 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
19e70 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
19e80 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
19e90 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
19ea0 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
19eb0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
19ec0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
19ed0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
19ee0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
19ef0 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
19f00 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
19f10 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
19f20 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
19f30 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
19f40 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
19f50 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
19f60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
19f70 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
19f80 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
19f90 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
19fa0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
19fb0 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
19fc0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
19fd0 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
19fe0 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
19ff0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1a000 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
1a010 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
1a020 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
1a030 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
1a040 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
1a050 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
1a060 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
1a070 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
1a080 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
1a090 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
1a0a0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
1a0b0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
1a0c0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
1a0d0 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
1a0e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
1a0f0 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
1a100 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
1a110 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
1a120 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
1a130 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1a140 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
1a150 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1a160 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
1a170 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1a180 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
1a190 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
1a1a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a1b0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1a1c0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
1a1d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
1a210 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
1a220 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1a230 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
1a240 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
1a250 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 20 26  riteSchema)==0 &
1a260 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
1a270 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
1a280 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a290 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1a2a0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a2b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1a2c0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1a2d0 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76  8312-64704 Howev
1a2e0 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73  er, the usable s
1a2f0 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ize is not allow
1a300 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
1a310 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49  less than 480. I
1a320 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1a330 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
1a340 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65  is 512, then the
1a350 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64  .    ** reserved
1a360 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e   space size cann
1a370 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f  ot exceed 32. */
1a380 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
1a390 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
1a3a0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a3b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1a3c0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
1a3d0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
1a3e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a3f0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
1a400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a410 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1a420 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
1a430 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
1a440 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
1a450 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
1a460 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
1a470 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
1a480 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
1a490 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
1a4a0 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
1a4b0 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
1a4c0 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
1a4d0 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
1a4e0 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
1a4f0 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
1a500 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
1a510 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
1a520 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
1a530 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
1a540 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
1a550 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
1a560 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
1a570 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
1a580 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
1a590 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
1a5a0 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
1a5b0 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
1a5c0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
1a5d0 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
1a5e0 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
1a5f0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1a600 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
1a610 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
1a620 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
1a630 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
1a640 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
1a650 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
1a660 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
1a670 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
1a680 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
1a690 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
1a6a0 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
1a6b0 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
1a6c0 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
1a6d0 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
1a6e0 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
1a6f0 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
1a700 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1a710 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
1a720 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
1a730 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
1a740 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1a750 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
1a760 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
1a770 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
1a780 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
1a790 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
1a7a0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1a7b0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
1a7c0 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
1a7d0 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
1a7e0 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1a7f0 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
1a800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
1a810 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
1a820 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
1a830 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
1a840 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
1a850 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
1a860 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
1a870 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1a880 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
1a890 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1a8a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a8b0 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
1a8c0 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
1a8d0 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1a8e0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1a8f0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1a900 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
1a910 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
1a920 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
1a930 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
1a940 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
1a950 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
1a960 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
1a970 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
1a980 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
1a990 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
1a9a0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
1a9b0 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
1a9c0 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
1a9d0 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
1a9e0 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
1a9f0 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
1aa00 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
1aa10 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1aa20 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1aa30 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
1aa40 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
1aa50 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
1aa60 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
1aa70 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
1aa80 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
1aa90 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
1aaa0 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
1aab0 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
1aac0 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
1aad0 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
1aae0 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
1aaf0 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
1ab00 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
1ab10 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
1ab20 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
1ab30 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
1ab40 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
1ab50 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
1ab60 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
1ab70 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
1ab80 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
1ab90 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
1aba0 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
1abb0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
1abc0 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
1abd0 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
1abe0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
1abf0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
1ac00 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
1ac10 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
1ac20 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
1ac30 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1ac40 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
1ac50 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1ac60 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
1ac70 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1ac80 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
1ac90 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1aca0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
1acb0 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
1acc0 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
1acd0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1ace0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
1acf0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1ad00 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
1ad10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1ad20 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1ad30 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
1ad40 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
1ad50 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
1ad60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ad70 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1ad80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
1ad90 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
1ada0 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
1adb0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1adc0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
1add0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
1ade0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1adf0 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
1ae00 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
1ae10 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1ae20 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
1ae30 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
1ae40 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
1ae50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1ae60 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
1ae70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
1ae80 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
1ae90 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1aea0 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1aeb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1aec0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1aed0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1aee0 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1aef0 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1af00 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1af10 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1af20 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1af30 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1af40 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1af50 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1af60 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1af70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1af80 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1af90 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1afa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1afb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1afc0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1afd0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1afe0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1aff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1b000 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1b010 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1b020 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1b030 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1b040 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b050 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1b060 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1b070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1b080 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1b090 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1b0a0 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1b0b0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1b0c0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1b0d0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1b0e0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1b0f0 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1b100 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1b110 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1b120 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1b130 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1b140 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1b150 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1b160 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1b170 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1b180 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1b190 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1b1a0 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1b1b0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1b1c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1b1d0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1b1e0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1b1f0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1b200 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1b210 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1b220 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1b230 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1b240 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1b250 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1b260 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1b270 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1b280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b290 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1b2a0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1b2b0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1b2c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1b2d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b2e0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1b2f0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1b300 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1b310 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1b320 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1b330 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1b340 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1b350 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1b360 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1b370 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1b380 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1b390 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b3a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1b3b0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1b3c0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1b3d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1b3e0 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1b3f0 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1b400 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1b410 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1b420 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1b430 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1b440 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1b450 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1b460 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1b470 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b480 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1b490 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1b4a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b4b0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1b4c0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1b4d0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1b4e0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1b4f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b510 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1b520 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1b530 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1b540 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1b550 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1b560 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1b570 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1b580 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1b590 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1b5a0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1b5b0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1b5c0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1b5d0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1b5e0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1b5f0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1b600 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1b610 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1b620 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1b630 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1b640 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1b650 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1b660 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1b670 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1b680 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1b690 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1b6a0 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1b6b0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1b6c0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1b6d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1b6e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1b6f0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1b700 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1b710 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1b720 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1b730 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1b740 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1b750 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1b760 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1b770 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1b780 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1b790 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1b7a0 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1b7b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1b7c0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1b7d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1b7e0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1b7f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b800 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1b810 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b820 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1b830 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1b840 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1b850 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1b860 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1b870 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1b880 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1b890 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1b8a0 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1b8b0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1b8c0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1b8d0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1b8e0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1b8f0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1b900 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1b910 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1b920 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1b930 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1b940 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1b950 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1b960 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1b970 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1b980 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1b990 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1b9a0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1b9b0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1b9c0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1b9d0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1b9e0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1b9f0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1ba00 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1ba10 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1ba20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1ba30 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1ba40 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1ba50 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1ba60 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1ba70 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1ba80 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1ba90 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1baa0 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1bab0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1bac0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1bad0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1bae0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1baf0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1bb00 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1bb10 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1bb20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1bb30 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1bb40 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1bb50 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1bb60 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1bb70 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1bb80 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1bb90 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1bba0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1bbb0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1bbc0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1bbd0 72 66 6c 61 67 2c 20 69 6e 74 20 2a 70 53 63 68  rflag, int *pSch
1bbe0 65 6d 61 56 65 72 73 69 6f 6e 29 7b 0a 20 20 42  emaVersion){.  B
1bbf0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1bc00 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1bc10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1bc20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1bc30 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1bc40 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1bc50 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
1bc60 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
1bc70 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
1bc80 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
1bc90 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
1bca0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
1bcb0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1bcc0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
1bcd0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
1bce0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1bcf0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1bd00 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
1bd10 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1bd20 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
1bd30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
1bd40 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
1bd50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1bd60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1bd70 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
1bd80 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
1bd90 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
1bda0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
1bdb0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
1bdc0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
1bdd0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
1bde0 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
1bdf0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1be00 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
1be10 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
1be20 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1be30 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
1be40 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
1be50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1be60 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1be70 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
1be80 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
1be90 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
1bea0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1beb0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
1bec0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
1bed0 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f  action .    ** o
1bee0 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
1bef0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
1bf00 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
1bf10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
1bf20 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64      ** requested
1bf30 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1bf40 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20  LOCKED..    */. 
1bf50 20 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26     if( (wrflag &
1bf60 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1bf70 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1bf80 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d  E).     || (pBt-
1bf90 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1bfa0 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20  PENDING)!=0.    
1bfb0 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  ){.      pBlock 
1bfc0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
1bfd0 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  db;.    }else if
1bfe0 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
1bff0 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
1c000 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74  r;.      for(pIt
1c010 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
1c020 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
1c030 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
1c040 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
1c050 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
1c060 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
1c070 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
1c080 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1c090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c0a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1c0b0 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
1c0c0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
1c0d0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
1c0e0 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  , pBlock);.     
1c0f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
1c100 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
1c110 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  .      goto tran
1c120 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20  s_begun;.    }. 
1c130 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1c140 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
1c150 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
1c160 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
1c170 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
1c180 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
1c190 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
1c1a0 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
1c1b0 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
1c1c0 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
1c1d0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
1c1e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
1c1f0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
1c200 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
1c210 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1c220 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
1c230 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
1c240 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1c250 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
1c260 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
1c270 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
1c280 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1c290 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1c2a0 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
1c2b0 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
1c2c0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
1c2d0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
1c2e0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
1c2f0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
1c300 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
1c310 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
1c320 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
1c330 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
1c340 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
1c350 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
1c360 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
1c370 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1c380 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
1c390 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
1c3a0 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
1c3b0 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
1c3c0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
1c3d0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1c3e0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
1c3f0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
1c400 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
1c410 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
1c420 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
1c430 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
1c440 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
1c450 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
1c460 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
1c470 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
1c480 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
1c490 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
1c4a0 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
1c4b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c4c0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1c4d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
1c4e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1c4f0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1c500 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c510 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1c520 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c530 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c540 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
1c550 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
1c560 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
1c570 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
1c580 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1c590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c5a0 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
1c5b0 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1c5c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c5d0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f  rc==SQLITE_BUSY_
1c5e0 53 4e 41 50 53 48 4f 54 20 26 26 20 70 42 74 2d  SNAPSHOT && pBt-
1c5f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1c600 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1c610 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68          /* if th
1c620 65 72 65 20 77 61 73 20 6e 6f 20 74 72 61 6e 73  ere was no trans
1c630 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68  action opened wh
1c640 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1c650 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1c660 2a 20 63 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c  * called and SQL
1c670 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
1c680 54 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 63  T is returned, c
1c690 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 0a  hange the error.
1c6a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1c6b0 65 20 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  e to SQLITE_BUSY
1c6c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1c6d0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1c6e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c6f0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1c700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c710 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1c720 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1c730 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1c740 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1c750 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1c760 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c770 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1c780 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1c790 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1c7a0 72 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69  r(pBt) );.  sqli
1c7b0 74 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63  te3PagerResetLoc
1c7c0 6b 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50  kTimeout(pBt->pP
1c7d0 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63  ager);..  if( rc
1c7e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c7f0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1c800 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
1c810 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1c820 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
1c830 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c840 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1c850 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
1c860 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
1c870 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
1c880 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
1c890 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
1c8a0 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1c8b0 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
1c8c0 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
1c8d0 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
1c8e0 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
1c8f0 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
1c900 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
1c910 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
1c920 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
1c930 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
1c940 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
1c950 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1c960 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c970 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
1c980 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1c990 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
1c9a0 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1c9b0 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
1c9c0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1c9d0 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
1c9e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1c9f0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1ca00 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
1ca10 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
1ca20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
1ca30 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
1ca40 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
1ca50 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
1ca60 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
1ca70 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1ca80 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
1ca90 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
1caa0 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
1cab0 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
1cac0 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
1cad0 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
1cae0 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
1caf0 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
1cb00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cb10 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
1cb20 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
1cb30 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
1cb40 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
1cb50 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1cb60 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
1cb70 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
1cb80 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
1cb90 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
1cba0 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
1cbb0 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
1cbc0 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
1cbd0 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
1cbe0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
1cbf0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1cc00 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1cc10 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
1cc20 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
1cc30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1cc40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1cc50 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1cc60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1cc70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cc80 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1cc90 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1cca0 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1ccb0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1ccc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ccd0 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
1cce0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ccf0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 63  K ){.    if( pSc
1cd00 68 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20  hemaVersion ){. 
1cd10 20 20 20 20 20 2a 70 53 63 68 65 6d 61 56 65 72       *pSchemaVer
1cd20 73 69 6f 6e 20 3d 20 67 65 74 34 62 79 74 65 28  sion = get4byte(
1cd30 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1cd40 61 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a  ata[40]);.    }.
1cd50 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
1cd60 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1cd70 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1cd80 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1cd90 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1cda0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a  umber of.      *
1cdb0 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
1cdc0 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
1cdd0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
1cde0 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
1cdf0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 75  .      ** the su
1ce00 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
1ce10 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
1ce20 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
1ce30 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
1ce40 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
1ce50 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1ce60 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1ce70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
1ce80 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
1ce90 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1cea0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
1ceb0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1cec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ced0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1cee0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1cef0 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
1cf00 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
1cf10 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
1cf20 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
1cf30 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
1cf40 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
1cf50 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
1cf60 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1cf70 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
1cf80 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
1cf90 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
1cfa0 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
1cfb0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1cfc0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1cfd0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1cfe0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
1d010 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
1d020 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d050 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
1d060 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d090 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1d0a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1d0b0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
1d0c0 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
1d0d0 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
1d0e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d0f0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1d100 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1d110 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  = pPage->isInit 
1d120 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74  ? SQLITE_OK : bt
1d130 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1d140 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1d150 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1d160 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70   rc;.  nCell = p
1d170 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1d180 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1d190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
1d1a0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1d1b0 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
1d1c0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
1d1d0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1d1e0 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
1d1f0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1d200 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
1d210 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
1d220 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
1d230 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1d240 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1d250 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1d260 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1d270 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1d280 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
1d290 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1d2a0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1d2b0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1d2c0 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
1d2d0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
1d2e0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1d2f0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
1d300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d310 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
1d320 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70   on pPage is a p
1d330 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
1d340 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68  From.  Modify th
1d350 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a  is pointer so.**
1d360 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1d370 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  to iTo. Paramete
1d380 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
1d390 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
1d3a0 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d  inter to.** be m
1d3b0 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c  odified, as  fol
1d3c0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
1d3d0 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
1d3e0 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1d3f0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1d400 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
1d410 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
1d420 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
1d430 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1d440 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
1d450 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1d460 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1d470 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
1d480 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1d4a0 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
1d4b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
1d4c0 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
1d4d0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1d4e0 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
1d4f0 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
1d500 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1d510 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
1d540 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
1d550 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
1d560 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
1d570 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
1d580 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
1d590 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
1d5a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d5b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1d5c0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1d5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1d5e0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
1d5f0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
1d600 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ge) );.  if( eTy
1d610 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1d620 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
1d630 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
1d640 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
1d650 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
1d660 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
1d670 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
1d680 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1d690 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
1d6a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d6b0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
1d6c0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
1d6d0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
1d6e0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
1d6f0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
1d700 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
1d710 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
1d720 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73    rc = pPage->is
1d730 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Init ? SQLITE_OK
1d740 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   : btreeInitPage
1d750 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
1d760 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1d770 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
1d780 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
1d790 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1d7a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
1d7b0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1d7c0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
1d7d0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1d7e0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1d7f0 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
1d800 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
1d810 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
1d820 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
1d830 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
1d840 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61    if( info.nLoca
1d850 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  l<info.nPayload 
1d860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1d870 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a   pCell+info.nSiz
1d880 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e > pPage->aData
1d890 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  +pPage->pBt->usa
1d8a0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
1d8b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1d8c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
1d8d0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
1d8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d8f0 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
1d900 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1d910 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20  Size-4) ){.     
1d920 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1d930 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1d940 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  -4, iTo);.      
1d950 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d970 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1d980 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
1d990 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
1d9a0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
1d9b0 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
1d9c0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1d9d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1d9e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d9f0 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
1da00 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
1da10 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
1da20 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
1da30 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
1da40 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1da50 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
1da60 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1da70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1da80 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
1da90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1daa0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1dab0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1dac0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
1dad0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1dae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1daf0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
1db00 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1db10 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
1db20 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
1db30 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
1db40 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
1db50 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
1db60 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
1db70 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
1db80 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
1db90 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
1dba0 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
1dbb0 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
1dbc0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
1dbd0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
1dbe0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
1dbf0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
1dc00 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
1dc10 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
1dc20 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
1dc30 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
1dc40 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
1dc50 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1dc60 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
1dc70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1dc80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1dc90 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
1dca0 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
1dcb0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
1dcc0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
1dcd0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
1dce0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1dcf0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
1dd00 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1dd10 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
1dd20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1dd30 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
1dd40 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
1dd50 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1dd60 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
1dd70 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
1dd80 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
1dd90 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
1dda0 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1ddb0 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
1ddc0 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
1ddd0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1dde0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
1ddf0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
1de00 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1de10 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
1de20 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
1de30 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
1de40 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
1de50 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
1de60 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1de70 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1de80 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
1de90 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1dea0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1deb0 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
1dec0 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
1ded0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1dee0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1def0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
1df00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1df10 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1df20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
1df30 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
1df40 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
1df50 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
1df60 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
1df70 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
1df80 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
1df90 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
1dfa0 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
1dfb0 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
1dfc0 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
1dfd0 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
1dfe0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1dff0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
1e000 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
1e010 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1e020 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
1e030 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
1e040 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
1e050 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1e060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1e070 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
1e080 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
1e090 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
1e0a0 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
1e0b0 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
1e0c0 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
1e0d0 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
1e0e0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
1e0f0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1e100 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
1e110 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
1e120 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
1e130 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
1e140 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
1e150 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
1e160 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1e170 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
1e180 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1e190 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
1e1a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
1e1b0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1e1c0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
1e1d0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
1e1e0 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
1e1f0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
1e200 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
1e210 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
1e220 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
1e230 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
1e240 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1e250 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1e260 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1e270 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
1e280 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
1e290 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e2a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1e2b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
1e2c0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
1e2d0 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
1e2e0 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
1e2f0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
1e300 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
1e310 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
1e320 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
1e330 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
1e340 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1e350 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e360 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e380 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1e390 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
1e3a0 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
1e3b0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
1e3c0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
1e3d0 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
1e3e0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
1e3f0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
1e400 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
1e410 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
1e420 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
1e430 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1e440 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1e450 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1e460 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
1e470 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
1e480 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1e490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e4a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e4b0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
1e4c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e4d0 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
1e4e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e4f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e500 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1e510 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
1e520 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e530 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
1e540 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
1e550 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
1e560 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
1e570 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1e580 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1e590 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e5a0 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
1e5b0 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
1e5c0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
1e5d0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1e5e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1e5f0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1e600 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
1e610 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
1e620 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
1e630 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1e640 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
1e650 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
1e660 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
1e670 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
1e680 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
1e690 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
1e6a0 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
1e6b0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1e6c0 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
1e6d0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1e6e0 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
1e6f0 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
1e700 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
1e710 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
1e720 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
1e730 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
1e740 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
1e750 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
1e760 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1e770 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
1e780 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   specifically, t
1e790 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
1e7a0 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
1e7b0 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
1e7c0 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
1e7d0 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
1e7e0 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
1e7f0 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
1e800 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
1e810 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
1e820 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
1e830 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1e840 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
1e850 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
1e860 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1e870 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
1e880 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1e890 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
1e8a0 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
1e8b0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
1e8c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1e8d0 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1e8e0 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
1e8f0 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
1e900 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
1e910 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1e920 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
1e930 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
1e940 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
1e950 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
1e960 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74  vacuum-on-commit
1e970 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
1e980 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
1e990 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1e9a0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
1e9b0 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
1e9c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1e9d0 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
1e9e0 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
1e9f0 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
1ea00 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
1ea10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ea20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
1ea30 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
1ea40 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1ea50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ea60 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1ea70 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1ea80 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
1ea90 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
1eaa0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1eab0 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
1eac0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1ead0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
1eae0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
1eaf0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
1eb00 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
1eb10 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1eb20 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1eb30 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
1eb40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
1eb50 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1eb60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
1eb70 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1eb80 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
1eb90 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
1eba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ebb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1ebc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ebd0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1ebe0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1ebf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ec00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ec10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1ec20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1ec30 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1ec40 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1ec50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
1ec60 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
1ec70 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
1ec80 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
1ec90 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
1eca0 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
1ecb0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
1ecc0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
1ecd0 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
1ece0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
1ecf0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1ed00 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1ed10 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
1ed20 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
1ed30 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
1ed40 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
1ed50 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
1ed60 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
1ed70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1ed80 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
1ed90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1eda0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1edb0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1edc0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1edd0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
1ede0 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
1edf0 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
1ee00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ee10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1ee20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1ee30 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1ee40 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
1ee50 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
1ee60 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1ee70 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1ee80 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
1ee90 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
1eea0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1eeb0 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
1eec0 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
1eed0 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
1eee0 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
1eef0 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
1ef00 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
1ef10 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
1ef20 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1ef30 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
1ef40 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
1ef50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
1ef60 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
1ef70 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1ef80 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
1ef90 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1efa0 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
1efb0 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
1efc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1efd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1efe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1eff0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
1f000 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
1f010 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
1f020 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
1f030 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
1f040 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
1f050 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
1f060 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
1f070 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
1f080 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
1f090 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
1f0a0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
1f0b0 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
1f0c0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1f0d0 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
1f0e0 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
1f0f0 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
1f100 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
1f110 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
1f120 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
1f130 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
1f140 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
1f150 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f160 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
1f170 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
1f180 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
1f190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
1f1a0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
1f1b0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1f1c0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1f1d0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1f1e0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1f1f0 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
1f200 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1f210 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f220 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1f230 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1f240 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f250 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1f260 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1f270 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1f280 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
1f290 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
1f2a0 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
1f2b0 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
1f2c0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
1f2d0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
1f2e0 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
1f2f0 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
1f300 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
1f310 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
1f320 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1f330 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1f340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f350 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f370 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
1f380 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
1f390 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
1f3a0 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
1f3b0 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
1f3c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
1f3d0 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
1f3e0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
1f3f0 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
1f400 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
1f410 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
1f420 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
1f430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f440 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
1f450 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
1f460 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1f470 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
1f480 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
1f490 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
1f4a0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
1f4b0 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
1f4c0 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
1f4d0 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
1f4e0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1f4f0 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
1f500 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
1f510 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
1f520 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
1f530 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
1f540 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
1f550 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
1f560 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f580 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1f590 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
1f5a0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
1f5b0 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
1f5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f5d0 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
1f5e0 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
1f5f0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f620 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
1f630 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
1f640 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
1f650 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
1f660 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
1f670 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
1f680 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
1f690 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
1f6a0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
1f6b0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
1f6c0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f6d0 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
1f6e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f6f0 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1f700 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
1f710 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
1f720 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
1f730 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f740 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1f750 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
1f760 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
1f770 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1f780 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
1f790 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
1f7a0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
1f7b0 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
1f7c0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
1f7d0 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
1f7e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1f7f0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
1f800 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
1f810 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
1f820 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1f830 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
1f840 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
1f850 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
1f860 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
1f870 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1f880 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
1f890 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1f8a0 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
1f8b0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1f8c0 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
1f8d0 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
1f8e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1f8f0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1f900 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1f910 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1f920 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1f930 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1f940 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1f950 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
1f960 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1f970 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
1f980 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1f990 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1f9a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1f9b0 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
1f9c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1f9d0 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
1f9e0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1f9f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1fa00 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
1fa10 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1fa20 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1fa30 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
1fa40 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
1fa50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1fa60 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1fa70 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
1fa80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1fa90 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1faa0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
1fab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fac0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
1fad0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1fae0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1faf0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1fb00 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1fb10 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
1fb20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1fb30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fb40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1fb50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1fb60 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1fb70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1fb80 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1fb90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1fba0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1fbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1fbc0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1fbd0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1fbe0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1fbf0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1fc00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1fc10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fc20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
1fc30 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1fc40 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
1fc50 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
1fc60 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for an 
1fc70 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1fc80 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
1fc90 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1fca0 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
1fcb0 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
1fcc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1fcd0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1fce0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1fcf0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
1fd00 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
1fd10 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
1fd20 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
1fd30 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
1fd40 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
1fd50 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
1fd60 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
1fd70 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
1fd80 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
1fd90 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
1fda0 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
1fdb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fdc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1fdd0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
1fde0 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
1fdf0 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
1fe00 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1fe10 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ; )..  assert( s
1fe20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1fe30 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1fe40 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
1fe50 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1fe60 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
1fe70 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1fe80 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
1fe90 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1fea0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1feb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1fec0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
1fed0 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
1fee0 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
1fef0 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1ff00 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1ff10 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1ff20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
1ff30 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
1ff40 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1ff50 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
1ff60 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
1ff70 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
1ff80 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
1ff90 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
1ffa0 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
1ffb0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1ffc0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
1ffd0 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
1ffe0 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
1fff0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20000 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
20010 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
20020 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
20030 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
20040 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
20050 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
20060 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
20070 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
20080 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
20090 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
200a0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
200b0 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
200c0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
200d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
200e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
200f0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
20100 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
20110 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20120 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
20130 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
20140 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
20150 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
20160 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
20170 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20180 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
20190 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
201a0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
201b0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
201c0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
201d0 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
201e0 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
201f0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
20200 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
20210 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
20220 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
20230 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
20240 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
20250 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
20260 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
20270 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20280 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20290 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
202a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
202b0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
202c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
202d0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
202e0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
202f0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
20300 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
20310 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
20320 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
20330 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
20340 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
20350 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
20360 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
20370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20380 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20390 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
203a0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
203b0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
203c0 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
203d0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
203e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
203f0 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
20400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
20410 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
20420 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
20430 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
20440 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
20450 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
20460 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
20470 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
20480 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
20490 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
204a0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
204b0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
204c0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
204d0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
204e0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
204f0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
20500 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
20510 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
20520 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
20530 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
20540 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
20550 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
20560 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
20570 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
20580 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
20590 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
205a0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
205b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
205c0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
205d0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
205e0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
205f0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
20600 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
20610 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
20620 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
20630 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
20640 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
20650 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
20660 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
20670 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
20680 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
20690 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
206a0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
206b0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
206c0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
206d0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
206e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
206f0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
20700 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
20710 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
20720 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
20730 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
20740 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
20750 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
20760 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
20770 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
20780 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
20790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
207a0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
207b0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
207c0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
207d0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
207e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
207f0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
20800 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
20810 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
20820 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
20830 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
20840 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
20850 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
20860 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
20870 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
20880 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
20890 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
208a0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
208b0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
208c0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
208d0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
208e0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
208f0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
20900 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
20910 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
20920 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
20930 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
20940 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
20950 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
20960 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
20970 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
20980 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
20990 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
209a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
209b0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
209c0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
209d0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
209e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
209f0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
20a00 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
20a10 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
20a20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
20a30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
20a40 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
20a50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20a60 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
20a70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
20a80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
20a90 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
20aa0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
20ab0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
20ad0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20ae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20b00 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
20b10 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
20b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
20b30 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
20b40 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
20b50 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
20b60 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
20b70 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
20b80 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
20b90 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
20ba0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20bb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
20bc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20bd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20be0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
20bf0 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
20c00 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
20c10 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
20c20 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
20c30 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
20c40 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
20c50 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
20c60 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
20c70 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
20c80 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
20c90 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20ca0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
20cb0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
20cc0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
20cd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20ce0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
20cf0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
20d00 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
20d10 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
20d20 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
20d30 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
20d40 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
20d50 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
20d60 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
20d70 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
20d80 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
20d90 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
20da0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
20db0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
20dc0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
20dd0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
20de0 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
20df0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
20e00 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
20e10 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
20e20 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
20e30 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
20e40 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
20e50 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
20e60 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
20e70 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
20e80 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
20e90 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
20ea0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
20eb0 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
20ec0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
20ed0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
20ee0 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
20ef0 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
20f00 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
20f10 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
20f20 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
20f30 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
20f40 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
20f50 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
20f60 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
20f70 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
20f80 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
20f90 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
20fa0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
20fb0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
20fc0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
20fd0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
20fe0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
20ff0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
21000 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
21010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
21020 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
21030 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
21040 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
21050 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
21060 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
21070 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
21080 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
21090 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
210a0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
210b0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
210c0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
210d0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
210e0 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
210f0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
21100 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
21110 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
21120 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
21130 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
21140 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
21150 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
21160 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
21170 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
21180 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
21190 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
211a0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
211b0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
211c0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
211d0 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
211e0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
211f0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
21200 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
21210 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
21220 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
21230 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
21240 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
21250 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
21260 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
21270 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
21280 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
21290 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
212a0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
212b0 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
212c0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
212d0 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
212e0 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
212f0 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
21300 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
21310 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
21320 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
21330 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
21340 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
21350 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
21360 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
21370 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
21380 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
21390 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
213a0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
213b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
213c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
213d0 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
213e0 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
213f0 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
21400 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
21410 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
21420 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
21430 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
21440 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
21450 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
21460 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
21470 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
21480 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
21490 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
214a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
214b0 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
214c0 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
214d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
214e0 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
214f0 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
21500 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
21510 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
21520 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
21530 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
21540 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
21550 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
21560 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
21570 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
21580 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
21590 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
215a0 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
215b0 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
215c0 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
215d0 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
215e0 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
215f0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
21600 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
21610 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
21620 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
21630 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
21640 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
21650 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
21660 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
21670 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
21680 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
21690 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
216a0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
216b0 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
216c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
216d0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
216e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
216f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21700 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
21710 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
21720 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
21730 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
21740 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
21750 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
21760 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
21770 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
21780 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
21790 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
217a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
217b0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
217c0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
217d0 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
217e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
217f0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
21800 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
21810 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
21820 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
21830 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
21840 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21850 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
21860 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
21870 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
21880 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
21890 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
218a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
218b0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
218c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
218d0 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69     p->iDataVersi
218e0 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e  on--;  /* Compen
218f0 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d  sate for pPager-
21900 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
21910 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   */.    pBt->inT
21920 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
21930 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
21940 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
21950 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
21960 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
21970 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
21980 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
21990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
219a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
219b0 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
219c0 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
219d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
219e0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
219f0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
21a00 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
21a10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21a20 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
21a30 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
21a40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21a50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21a60 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
21a70 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
21a80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21a90 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
21aa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
21ab0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
21ac0 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
21ad0 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
21ae0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
21af0 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
21b00 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79  ry cursor on any
21b10 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
21b20 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
21b30 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20  ces.  Or if the 
21b40 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
21b50 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e  s set to 1, then
21b60 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72   only.** trip wr
21b70 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ite cursors and 
21b80 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f  leave read curso
21b90 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  rs unchanged..**
21ba0 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
21bb0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
21bc0 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69  to be tripped, i
21bd0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
21be0 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  .** that belong 
21bf0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
21c00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
21c10 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a  at happen to be.
21c20 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63  ** sharing the c
21c30 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
21c40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21c50 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
21c60 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
21c70 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
21c80 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61  writeOnly.** fla
21c90 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
21ca0 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f  only write-curso
21cb0 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70  rs need be tripp
21cc0 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  ed - read-only.*
21cd0 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74  * cursors save t
21ce0 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73  heir current pos
21cf0 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  itions so that t
21d00 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65  hey may continue
21d10 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
21d20 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c  he rollback. Or,
21d30 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
21d40 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73   false, all curs
21d50 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70  ors are .** trip
21d60 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c  ped. In general,
21d70 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
21d80 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  lse if the trans
21d90 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  action being.** 
21da0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69  rolled back modi
21db0 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
21dc0 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69  e schema. In thi
21dd0 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f  s case b-tree ro
21de0 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20  ot.** pages may 
21df0 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65  be moved or dele
21e00 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
21e10 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72  abase altogether
21e20 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75  , making.** it u
21e30 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63  nsafe for read c
21e40 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e  ursors to contin
21e50 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
21e60 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
21e70 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65  is true and an e
21e80 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
21e90 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61  red while .** sa
21ea0 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ving the current
21eb0 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72   position of a r
21ec0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
21ed0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a   all cursors, .*
21ee0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  * including all 
21ef0 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65  read-cursors are
21f00 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   tripped..**.** 
21f10 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21f20 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
21f30 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ful, or if an er
21f40 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
21f50 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72  .** saving a cur
21f60 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  sor position, an
21f70 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
21f80 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
21f90 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
21fa0 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
21fb0 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
21fc0 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
21fd0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
21fe0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21ff0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
22000 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  ( (writeOnly==0 
22010 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29  || writeOnly==1)
22020 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c   && BTCF_WriteFl
22030 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
22040 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
22050 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
22060 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28  Btree);.    for(
22070 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
22080 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
22090 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
220a0 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28  ( writeOnly && (
220b0 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
220c0 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
220d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
220e0 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
220f0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
22100 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
22110 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
22120 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
22130 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
22140 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
22150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22160 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
22170 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
22180 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
22190 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
221a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
221b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
221c0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
221d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
221e0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
221f0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
22200 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
22210 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
22220 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
22230 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
22240 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
22250 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
22260 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22270 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
22280 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
22290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
222a0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
222b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
222c0 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ogress..**.** If
222d0 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
222e0 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20   SQLITE_OK then 
222f0 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
22300 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69  invalidated (tri
22310 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77  pped)..** Only w
22320 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
22330 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
22340 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75  eOnly is true bu
22350 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  t all cursors ar
22360 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20  e.** tripped if 
22370 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
22380 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  se.  Any attempt
22390 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69   to use.** a tri
223a0 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c  pped cursor will
223b0 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
223c0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
223d0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
223e0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
223f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22400 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
22410 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
22420 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
22430 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
22440 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
22450 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
22460 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
22470 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72  tripCode, int wr
22480 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  iteOnly){.  int 
22490 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
224a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
224b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
224c0 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74  ..  assert( writ
224d0 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74  eOnly==1 || writ
224e0 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  eOnly==0 );.  as
224f0 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d  sert( tripCode==
22500 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
22510 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64  LBACK || tripCod
22520 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
22530 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
22540 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72  ter(p);.  if( tr
22550 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
22560 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72  K ){.    rc = tr
22570 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c  ipCode = saveAll
22580 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
22590 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
225a0 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a   writeOnly = 0;.
225b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
225c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
225d0 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20  .  if( tripCode 
225e0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
225f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
22600 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
22610 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e  ripCode, writeOn
22620 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ly);.    assert(
22630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
22640 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  | (writeOnly==0 
22650 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  && rc2==SQLITE_O
22660 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  K) );.    if( rc
22670 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  2!=SQLITE_OK ) r
22680 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62  c = rc2;.  }.  b
22690 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
226a0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
226b0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
226c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
226d0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
226e0 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
226f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
22700 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
22710 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
22720 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
22730 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
22740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
22750 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
22760 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
22770 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
22780 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
22790 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
227a0 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
227b0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
227c0 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
227d0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
227e0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
227f0 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
22800 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
22810 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
22820 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
22830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22840 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
22850 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
22860 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
22870 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
22880 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
22890 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
228a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
228b0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
228c0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
228d0 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
228e0 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
228f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
22900 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
22910 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
22920 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
22930 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
22940 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
22950 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  , 1)==0 );.    p
22960 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22970 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
22980 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
22990 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
229a0 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
229b0 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
229c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
229d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
229e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
229f0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
22a00 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
22a10 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
22a20 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
22a30 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
22a40 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
22a50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
22a60 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
22a70 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
22a80 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
22a90 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
22aa0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
22ab0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
22ac0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
22ad0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
22ae0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
22af0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
22b00 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
22b10 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
22b20 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
22b30 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
22b40 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
22b50 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
22b60 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
22b70 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
22b80 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
22b90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
22ba0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
22bb0 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
22bc0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
22bd0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
22be0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
22bf0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
22c00 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
22c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
22c20 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
22c30 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
22c40 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
22c50 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
22c60 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
22c70 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
22c80 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
22c90 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
22ca0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
22cb0 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
22cc0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
22cd0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
22ce0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
22cf0 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
22d00 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
22d10 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
22d20 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
22d30 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
22d40 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
22d50 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
22d60 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
22d70 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
22d80 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
22d90 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
22da0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
22db0 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
22dc0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
22dd0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
22de0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
22df0 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
22e00 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
22e10 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
22e20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22e30 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
22e40 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
22e50 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
22e60 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
22e70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
22e80 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
22e90 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
22ea0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
22eb0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
22ec0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
22ed0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
22ee0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
22ef0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
22f00 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
22f10 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
22f20 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
22f30 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
22f40 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
22f50 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
22f60 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
22f70 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
22f80 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
22f90 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
22fa0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
22fb0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
22fc0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
22fd0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
22fe0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
22ff0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
23000 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
23010 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
23020 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
23030 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
23040 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
23050 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
23060 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
23070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23080 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
23090 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
230a0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
230b0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
230c0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
230d0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
230e0 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
230f0 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
23100 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
23110 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
23120 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
23130 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
23140 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
23150 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
23160 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
23170 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
23180 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
23190 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
231a0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
231b0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
231c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
231d0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
231e0 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
231f0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
23200 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
23210 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
23220 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
23230 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
23240 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
23250 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
23260 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
23270 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
23280 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
23290 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
232a0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
232b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
232c0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
232d0 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
232e0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
232f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23300 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
23310 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
23320 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
23330 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23340 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
23350 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
23360 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
23370 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
23380 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23390 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
233a0 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
233b0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
233c0 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
233d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
233e0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66 28  nter(p);.    if(
233f0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
23400 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
23410 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
23420 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
23430 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
23440 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23460 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
23470 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
23480 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
23490 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
234a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
234b0 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
234c0 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74  nt<0 && (pBt->bt
234d0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49  sFlags & BTS_INI
234e0 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30  TIALLY_EMPTY)!=0
234f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
23500 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
23510 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e    }.      rc = n
23520 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
23530 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
23540 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20  e = get4byte(28 
23550 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  + pBt->pPage1->a
23560 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
23570 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
23580 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ze was written i
23590 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32  nto the offset 2
235a0 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a  8 of the header.
235b0 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
235c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
235d0 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f  arted, so we kno
235e0 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  w that the value
235f0 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20   at offset.     
23600 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72   ** 28 is nonzer
23610 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  o. */.      asse
23620 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  rt( pBt->nPage>0
23630 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
23640 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23650 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
23660 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
23670 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
23680 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
23690 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
236a0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
236b0 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
236c0 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
236d0 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
236e0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
236f0 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
23700 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
23710 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
23720 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
23730 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
23740 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
23750 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
23760 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
23770 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
23780 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
23790 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
237a0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
237b0 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53  f the BTREE_WRCS
237c0 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20  R bit of wrFlag 
237d0 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74  is clear, then t
237e0 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
237f0 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f  ly.** be used fo
23800 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74  r reading.  If t
23810 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62  he BTREE_WRCSR b
23820 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  it is set, then 
23830 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
23840 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
23850 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69  ading or for wri
23860 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
23870 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
23880 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  ting.** are also
23890 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65   met.  These are
238a0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
238b0 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
238c0 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72   in order.** for
238d0 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61   writing to be a
238e0 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
238f0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
23900 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
23910 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63  ed with wrFlag c
23920 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f  ontaining BTREE_
23930 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  WRCSR.**.** 2:  
23940 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
23950 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
23960 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
23970 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
23980 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
23990 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
239a0 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
239b0 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
239c0 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
239d0 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
239e0 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
239f0 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
23a00 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
23a10 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
23a20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
23a30 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
23a40 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
23a50 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
23a60 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
23a70 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
23a80 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
23a90 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
23aa0 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
23ab0 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
23ac0 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
23ad0 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
23ae0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
23af0 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45   The BTREE_FORDE
23b00 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c  LETE bit of wrFl
23b10 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c  ag may optionall
23b20 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45  y be set if BTRE
23b30 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65  E_WRCSR.** is se
23b40 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45  t.  If FORDELETE
23b50 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73   is set, that is
23b60 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69   a hint to the i
23b70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
23b80 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f  at.** this curso
23b90 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75  r will only be u
23ba0 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61  sed to seek to a
23bb0 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65  nd delete entrie
23bc0 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  s of an index.**
23bd0 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61   as part of a la
23be0 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74  rger DELETE stat
23bf0 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44  ement.  The FORD
23c00 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f  ELETE hint is no
23c10 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69  t used by.** thi
23c20 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
23c30 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f  .  But in a hypo
23c40 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61  thetical alterna
23c50 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67  tive storage eng
23c60 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68  ine .** in which
23c70 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
23c80 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
23c90 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f   deleted when co
23ca0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
23cb0 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65  e.** rows are de
23cc0 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45  leted, the FORDE
23cd0 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68  LETE flag is a h
23ce0 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45  int that all SEE
23cf0 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20  K and DELETE.** 
23d00 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68  operations on th
23d10 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  is cursor can be
23d20 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20   no-ops and all 
23d30 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20  READ operations 
23d40 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  can .** return a
23d50 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74   null row (2-byt
23d60 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a  es: 0x01 0x00)..
23d70 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
23d80 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
23d90 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
23da0 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
23db0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
23dc0 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
23dd0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
23de0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
23df0 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
23e00 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
23e10 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
23e20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
23e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23e40 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
23e50 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
23e60 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
23e70 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
23e80 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
23e90 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
23ea0 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
23eb0 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
23ec0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
23ef0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
23f00 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
23f30 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
23f40 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
23f70 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
23f80 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
23f90 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
23fa0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
23fb0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
23fc0 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
23fd0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
23fe0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
24010 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
24020 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
24030 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
24040 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
24050 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
24060 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
24070 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24090 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68  Looping over oth
240a0 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a  er all cursors *
240b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
240c0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
240d0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
240e0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20  rt( wrFlag==0 . 
240f0 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
24100 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20  =BTREE_WRCSR .  
24110 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
24120 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52  (BTREE_WRCSR|BTR
24130 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20  EE_FORDELETE) . 
24140 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
24150 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
24160 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
24170 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
24180 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
24190 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
241a0 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
241b0 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
241c0 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
241d0 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
241e0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
241f0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
24200 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
24210 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
24220 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
24230 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
24240 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
24250 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
24260 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
24270 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29   (wrFlag?2:1)) )
24280 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
24290 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
242a0 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
242b0 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
242c0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
242d0 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
242e0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
242f0 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
24300 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
24310 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
24320 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
24330 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
24340 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
24350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
24360 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
24370 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
24380 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
24390 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62  ag==0 || (pBt->b
243a0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
243b0 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a  AD_ONLY)==0 );..
243c0 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a    if( wrFlag ){.
243d0 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
243e0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
243f0 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
24400 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
24410 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
24420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
24430 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
24440 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
24450 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
24460 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
24470 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
24480 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
24490 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
244a0 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
244b0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
244c0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
244d0 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
244e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
244f0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
24500 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
24510 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
24520 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
24530 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
24540 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
24550 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
24560 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
24570 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
24580 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
24590 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43  s = wrFlag ? BTC
245a0 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b  F_WriteFlag : 0;
245b0 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  .  pCur->curPage
245c0 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
245d0 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f  ? 0 : PAGER_GET_
245e0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49  READONLY;.  /* I
245f0 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
24600 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20  or more cursors 
24610 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65  on the same btre
24620 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68  e, then all such
24630 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d  .  ** cursors *m
24640 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54  ust* have the BT
24650 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
24660 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70   set. */.  for(p
24670 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  X=pBt->pCursor; 
24680 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
24690 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70  ){.    if( pX->p
246a0 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69  gnoRoot==(Pgno)i
246b0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70  Table ){.      p
246c0 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  X->curFlags |= B
246d0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
246e0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
246f0 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
24700 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ple;.    }.  }. 
24710 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
24720 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70  Bt->pCursor;.  p
24730 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
24740 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
24750 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
24760 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  LID;.  return SQ
24770 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
24780 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
24790 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
247d0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24800 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
24810 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
24820 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
24830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24850 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
24860 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
24870 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
24880 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
24890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
248a0 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
248b0 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
248c0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
248f0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
24900 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
24910 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b   if( iTable<1 ){
24920 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
24930 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
24950 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
24960 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
24970 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
24980 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
24990 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73  fo, pCur);.    s
249a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
249b0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
249c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
249d0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
249e0 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
249f0 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
24a00 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
24a10 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
24a20 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
24a30 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
24a40 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
24a50 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
24a60 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
24a70 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
24a80 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
24a90 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
24aa0 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
24ab0 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
24ac0 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
24ad0 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
24ae0 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
24af0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
24b00 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
24b10 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  urn ROUND8(sizeo
24b20 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a  f(BtCursor));.}.
24b30 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
24b40 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69  e memory that wi
24b50 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
24b60 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20  into a BtCursor 
24b70 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
24b80 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63  e simple approac
24b90 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20  h here would be 
24ba0 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20  to memset() the 
24bb0 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a  entire object.**
24bc0 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69   to zero.  But i
24bd0 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74  t turns out that
24be0 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e   the apPage[] an
24bf0 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  d aiIdx[] arrays
24c00 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  .** do not need 
24c10 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64  to be zeroed and
24c20 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c   they are large,
24c30 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
24c40 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d  a lot.** of run-
24c50 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67  time by skipping
24c60 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
24c70 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65  ion of those ele
24c80 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ments..*/.void s
24c90 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
24ca0 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a  rZero(BtCursor *
24cb0 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
24cc0 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  0, offsetof(BtCu
24cd0 72 73 6f 72 2c 20 42 54 43 55 52 53 4f 52 5f 46  rsor, BTCURSOR_F
24ce0 49 52 53 54 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d  IRST_UNINIT));.}
24cf0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
24d00 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
24d10 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
24d20 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
24d30 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
24d40 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
24d50 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
24d60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
24d70 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
24d80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
24d90 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
24da0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
24db0 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42   pBtree ){.    B
24dc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
24dd0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
24de0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
24df0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
24e00 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
24e10 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
24e20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43  pBt->pCursor==pC
24e30 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ur ){.      pBt-
24e40 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
24e50 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
24e60 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f  e{.      BtCurso
24e70 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e  r *pPrev = pBt->
24e80 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64  pCursor;.      d
24e90 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
24ea0 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75  Prev->pNext==pCu
24eb0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
24ec0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
24ed0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ur->pNext;.     
24ee0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
24f00 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65  rev = pPrev->pNe
24f10 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  xt;.      }while
24f20 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20  ( ALWAYS(pPrev) 
24f30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  );.    }.    btr
24f40 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
24f50 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
24f60 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
24f70 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
24f80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
24f90 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
24fa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24fb0 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
24fc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
24fd0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
24fe0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24ff0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
25000 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
25010 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
25020 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
25030 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
25040 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
25050 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
25060 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
25070 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
25080 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
25090 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
250a0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
250b0 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
250c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
250d0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
250e0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
250f0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
25100 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
25110 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
25120 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  l()..*/.#ifndef 
25130 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
25140 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61  int cellInfoEqua
25150 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43  l(CellInfo *a, C
25160 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20  ellInfo *b){.   
25170 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d   if( a->nKey!=b-
25180 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30  >nKey ) return 0
25190 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70 50 61  ;.    if( a->pPa
251a0 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f  yload!=b->pPaylo
251b0 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ad ) return 0;. 
251c0 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f     if( a->nPaylo
251d0 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20  ad!=b->nPayload 
251e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
251f0 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62  if( a->nLocal!=b
25200 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75 72  ->nLocal ) retur
25210 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e  n 0;.    if( a->
25220 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20  nSize!=b->nSize 
25230 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25240 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
25250 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25260 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
25270 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
25280 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
25290 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
252a0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
252b0 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
252c0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
252d0 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e  e, pCur->ix, &in
252e0 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
252f0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 63   CORRUPT_DB || c
25300 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e  ellInfoEqual(&in
25310 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  fo, &pCur->info)
25320 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
25330 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
25340 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
25350 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
25360 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
25370 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
25380 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
25390 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
253a0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
253b0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
253c0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
253d0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
253e0 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72  pCur->pPage,pCur
253f0 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  ->ix,&pCur->info
25400 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25410 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
25420 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Cur);.  }.}..#if
25430 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
25440 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
25450 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
25460 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
25470 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
25480 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
25490 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
254a0 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
254b0 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
254c0 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
254d0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
254e0 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
254f0 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
25500 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
25510 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
25520 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
25530 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
25540 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
25550 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
25560 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
25570 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25580 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
25590 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
255a0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
255b0 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
255c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
255d0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e  eCursorIsValidNN
255e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
255f0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  {.  assert( pCur
25600 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
25610 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25620 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  RSOR_VALID;.}../
25630 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25640 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
25650 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77  eger key or "row
25660 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20  id" for a table 
25670 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72  btree..** This r
25680 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76  outine is only v
25690 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f  alid for a curso
256a0 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69  r that is pointi
256b0 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64  ng into a.** ord
256c0 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65  inary table btre
256d0 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
256e0 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69  r points to an i
256f0 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a  ndex btree or.**
25700 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   is invalid, the
25710 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20   result of this 
25720 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66  routine is undef
25730 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  ined..*/.i64 sql
25740 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
25750 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
25760 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
25770 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25780 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25790 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
257a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
257b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
257c0 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
257d0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
257e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
257f0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a  ->info.nKey;.}..
25800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
25810 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
25820 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  FUNC./*.** Retur
25830 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  n the offset int
25840 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
25850 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ile for the star
25860 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c  t of the.** payl
25870 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74 68 65  oad to which the
25880 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
25890 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ing..*/.i64 sqli
258a0 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28 42  te3BtreeOffset(B
258b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
258c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
258d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
258e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
258f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25900 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
25910 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
25920 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 70  .  return (i64)p
25930 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  Cur->pBt->pageSi
25940 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70  ze*((i64)pCur->p
25950 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20  Page->pgno - 1) 
25960 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36 34 29  +.         (i64)
25970 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  (pCur->info.pPay
25980 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61  load - pCur->pPa
25990 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65  ge->aData);.}.#e
259a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
259b0 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
259c0 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _FUNC */../*.** 
259d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
259e0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
259f0 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
25a00 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
25a10 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
25a20 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
25a30 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
25a40 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
25a50 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
25a60 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
25a70 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
25a80 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
25a90 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
25aa0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
25ab0 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
25ac0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25ad0 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
25ae0 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
25af0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
25b00 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
25b10 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
25b20 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
25b30 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
25b40 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
25b50 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
25b60 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
25b70 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
25b80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
25b90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25ba0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25bb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25bc0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25bd0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
25be0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
25bf0 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
25c00 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
25c10 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
25c20 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
25c30 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
25c40 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
25c50 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
25c60 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
25c70 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
25c80 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
25c90 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
25ca0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
25cb0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
25cc0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
25cd0 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
25ce0 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
25cf0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
25d00 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
25d10 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
25d20 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
25d30 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
25d40 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
25d50 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
25d60 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
25d70 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
25d80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25d90 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
25da0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
25db0 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
25dc0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
25dd0 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
25de0 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
25df0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
25e00 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
25e10 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
25e20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
25e30 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
25e40 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
25e50 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
25e60 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
25e70 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
25e80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
25e90 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
25ea0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
25eb0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
25ec0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
25ed0 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
25ee0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
25ef0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
25f00 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
25f10 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
25f20 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
25f30 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
25f40 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
25f50 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
25f60 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
25f70 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
25f80 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
25f90 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
25fa0 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
25fb0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
25fc0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
25fd0 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
25fe0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
25ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26000 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26010 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26030 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
26040 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
26050 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
26060 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
26070 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
26080 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
26090 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
260a0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
260b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
260c0 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
260d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
260e0 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
260f0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
26100 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
26110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26120 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26130 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
26140 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
26150 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
26160 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
26170 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26180 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
26190 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
261a0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
261b0 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
261c0 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
261d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
261e0 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
261f0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
26200 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
26210 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
26220 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
26230 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
26240 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
26250 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
26260 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
26270 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
26280 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
26290 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
262a0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
262b0 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
262c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
262d0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
262e0 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
262f0 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
26300 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
26310 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
26320 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
26330 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
26340 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
26350 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
26360 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
26370 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
26380 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
26390 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
263a0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
263b0 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
263c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
263d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
263e0 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
263f0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
26400 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
26410 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
26420 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
26430 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
26440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
26450 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
26460 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
26470 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
26480 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26490 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
264a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
264b0 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
264c0 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
264d0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
264e0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
264f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
26500 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
26510 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26520 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
26530 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
26540 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
26550 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
26560 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
26570 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
26580 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
26590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
265a0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
265b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
265c0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
265d0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
265e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
265f0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
26600 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
26610 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
26620 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
26630 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
26640 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
26650 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
26660 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
26670 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
26680 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
26690 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
266a0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
266b0 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
266c0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
266d0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
266e0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
266f0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
26700 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
26710 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
26720 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
26730 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
26740 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
26750 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
26760 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
26770 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
26780 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
26790 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
267a0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
267b0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
267c0 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
267d0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
267e0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
267f0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
26800 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
26810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26820 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
26830 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26850 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
26860 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
26870 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
26880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
26890 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
268a0 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
268b0 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
268c0 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
268d0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
268e0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
268f0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
26900 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
26910 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
26920 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
26930 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
26940 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
26950 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
26960 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
26970 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26980 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
26990 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
269a0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
269b0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
269c0 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
269d0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
269e0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
269f0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
26a00 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
26a10 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
26a20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
26a30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26a40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26a50 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
26a60 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
26a70 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
26a80 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
26a90 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
26aa0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
26ab0 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
26ac0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
26ad0 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
26ae0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
26af0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
26b00 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
26b10 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
26b20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
26b30 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
26b40 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
26b50 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
26b60 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
26b70 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
26b80 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
26b90 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
26ba0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
26bb0 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
26bc0 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
26bd0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
26be0 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
26bf0 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
26c00 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
26c10 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
26c20 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
26c30 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
26c40 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
26c50 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
26c60 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
26c70 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
26c80 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
26c90 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ages.** this fun
26ca0 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
26cb0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
26cc0 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
26cd0 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  .** the overflow
26ce0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26cf0 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
26d00 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
26d10 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
26d20 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
26d30 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
26d40 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
26d50 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
26d60 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
26d70 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
26d80 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
26d90 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
26da0 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62  cated, it must b
26db0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
26dc0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
26dd0 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
26de0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
26df0 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
26e00 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
26e10 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
26e20 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
26e30 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
26e40 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
26e50 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
26e60 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
26e70 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
26e80 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
26e90 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
26ea0 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
26eb0 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
26ec0 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
26ed0 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
26ee0 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
26ef0 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
26f00 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
26f10 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
26f20 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
26f30 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
26f40 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
26f50 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
26f60 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
26f70 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
26f80 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
26f90 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
26fa0 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
26fb0 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26fd0 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
26fe0 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
26ff0 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
27000 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
27010 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
27020 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27040 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
27050 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
27060 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
27070 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
27080 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
27090 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
270a0 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
270b0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
270c0 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >pPage;         
270d0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70        /* Btree p
270e0 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
270f0 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
27100 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
27110 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
27120 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
27130 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
27140 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
27150 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
27160 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
27170 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
27180 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
27190 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61  pBuf;     /* Sta
271a0 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f  rt of original o
271b0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e  ut buffer */.#en
271c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
271d0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
271e0 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d  ( eOp==0 || eOp=
271f0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
27200 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27210 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
27220 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
27230 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
27240 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27250 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27260 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
27270 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
27280 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
27290 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61  fo.pPayload;.  a
272a0 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
272b0 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
272c0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61  nPayload );..  a
272d0 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20  ssert( aPayload 
272e0 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  > pPage->aData )
272f0 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61  ;.  if( (uptr)(a
27300 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d  Payload - pPage-
27310 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e  >aData) > (pBt->
27320 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75  usableSize - pCu
27330 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  r->info.nLocal) 
27340 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
27350 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
27360 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
27370 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
27380 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20   error.  The.   
27390 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   ** conditional 
273a0 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a  above is really:
273b0 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79  .    **    &aPay
273c0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
273d0 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
273e0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
273f0 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20  bleSize].    ** 
27400 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e  but is recast in
27410 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66  to its current f
27420 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74  orm to avoid int
27430 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72  eger overflow pr
27440 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20  oblems.    */.  
27450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27460 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
27470 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ge);.  }..  /* C
27480 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
27490 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
274a0 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
274b0 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
274c0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
274d0 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
274e0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
274f0 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
27500 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
27510 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
27520 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
27530 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
27540 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
27550 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
27560 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
27570 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
27580 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
27590 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
275a0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
275b0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
275c0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
275d0 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
275e0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Local;.  }...  i
275f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27600 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
27610 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
27620 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
27630 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
27640 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
27650 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
27660 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
27670 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
27680 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
27690 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
276a0 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
276b0 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
276c0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
276d0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
276e0 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
276f0 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   now..    **.   
27700 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
27710 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
27720 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
27730 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
27740 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
27750 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
27760 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
27770 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
27780 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
27790 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
277a0 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
277b0 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
277c0 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
277d0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
277e0 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
277f0 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
27800 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
27810 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
27820 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
27830 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
27840 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
27850 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
27860 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
27870 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
27880 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
27890 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
278a0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
278b0 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20  >aOverflow==0.  
278c0 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69       || nOvfl*(i
278d0 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20  nt)sizeof(Pgno) 
278e0 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  > sqlite3MallocS
278f0 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ize(pCur->aOverf
27900 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  low).      ){.  
27910 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
27920 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
27930 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
27940 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
27950 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
27960 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
27970 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
27980 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
27990 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
279a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
279b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
279c0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
279d0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
279e0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
279f0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
27a00 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
27a10 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
27a20 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
27a30 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
27a40 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  |= BTCF_ValidOvf
27a50 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
27a60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
27a70 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27a80 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
27a90 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
27aa0 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79  e.      ** entry
27ab0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
27ac0 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
27ad0 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
27ae0 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69  skip.      ** di
27af0 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
27b00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
27b10 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27b20 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
27b30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64  ] ){.        iId
27b40 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
27b50 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Size);.        n
27b60 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
27b70 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
27b80 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
27b90 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
27ba0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
27bb0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
27bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27bd0 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68   amt>0 );.    wh
27be0 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b  ile( nextPage ){
27bf0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
27c00 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
27c10 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
27c20 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
27c30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27c40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
27c50 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
27c60 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61        || pCur->a
27c70 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
27c80 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20  nextPage.       
27c90 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
27ca0 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43  T_DB );.      pC
27cb0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
27cc0 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
27cd0 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
27ce0 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
27cf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
27d00 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
27d10 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
27d20 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
27d30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
27d40 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
27d50 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
27d60 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
27d70 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
27d80 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
27d90 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
27da0 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
27db0 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
27dc0 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
27dd0 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
27de0 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
27df0 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
27e00 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
27e10 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
27e20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
27e30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
27e40 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
27e50 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
27e60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27e70 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d  pBtree->db==pBt-
27e80 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >db );.        i
27e90 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
27ea0 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
27eb0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
27ec0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
27ed0 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
27ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27ef0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
27f00 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
27f10 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
27f20 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
27f30 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
27f40 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
27f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27f60 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
27f70 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
27f80 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
27f90 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
27fa0 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
27fb0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
27fc0 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
27fd0 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
27fe0 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
27ff0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
28000 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
28010 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
28020 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
28030 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72        /* File fr
28040 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64  om which to do d
28050 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72  irect overflow r
28060 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
28070 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
28080 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
28090 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
280a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
280b0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
280c0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
280d0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
280e0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
280f0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
28100 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
28110 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
28120 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28130 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
28140 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
28150 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
28160 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
28170 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
28180 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
28190 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
281a0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
281b0 20 20 20 33 29 20 74 68 65 72 65 20 69 73 20 6e     3) there is n
281c0 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61  o open write-tra
281d0 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
281e0 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
281f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
28200 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
28210 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
28220 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
28230 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20  n the WAL file. 
28240 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
28250 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
28260 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
28270 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20  n read into the 
28280 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20  output buffer . 
28290 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
282a0 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
282b0 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
282c0 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
282d0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
282e0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
282f0 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
28300 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
28310 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
28320 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
28330 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
28340 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
28350 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
28360 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
28370 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28380 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20       if( eOp==0 
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
283c0 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
283d0 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
28410 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
28420 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
28430 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28450 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
28460 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
28470 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
28480 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
28490 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f  ds     /* (4) */
284a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
284b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57  sqlite3PagerUseW
284c0 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
284d0 6e 65 78 74 50 61 67 65 29 20 20 20 20 20 20 20  nextPage)       
284e0 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
284f0 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
28500 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
28530 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
28540 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
28550 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
28560 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
28570 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
28580 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
28590 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285b0 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20        /* due to 
285c0 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
285d0 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
285e0 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
285f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28600 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
28610 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
28620 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
28630 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
28640 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
28650 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
28660 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
28670 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
28680 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
28690 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
286a0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
286b0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
286c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
286d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
286e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
286f0 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
28700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
28710 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  eOp==0 ? PAGER_G
28720 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
28730 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
28740 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
28750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28760 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
28770 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
28780 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
28790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
287a0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
287b0 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
287c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
287d0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
287e0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
287f0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
28800 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28810 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
28820 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
28830 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
28840 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
28850 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28860 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
28870 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d         if( amt==
28880 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
28890 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
288a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
288b0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
288c0 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20        iIdx++;.  
288d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
288e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
288f0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  amt>0 ){.    /* 
28900 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65  Overflow chain e
28910 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20  nds prematurely 
28920 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
28930 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
28940 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
28950 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28960 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
28970 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
28980 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
28990 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
289a0 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
289b0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
289c0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
289d0 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
289e0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
289f0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
28a00 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
28a10 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
28a20 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
28a30 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
28a40 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
28a50 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
28a60 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
28a70 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
28a80 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
28a90 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
28aa0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
28ab0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
28ac0 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
28ad0 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
28ae0 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
28af0 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
28b00 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
28b10 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
28b20 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
28b30 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
28b40 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
28b50 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28b60 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
28b70 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
28b80 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
28b90 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
28ba0 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
28bb0 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
28bc0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
28bd0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
28be0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
28bf0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
28c00 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
28c10 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
28c20 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
28c30 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
28c40 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
28c50 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
28c60 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28c70 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
28c80 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
28c90 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
28ca0 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
28cb0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28cc0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
28cd0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28ce0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28d00 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
28d10 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
28d20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
28d30 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
28d40 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
28d50 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
28d60 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
28d70 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
28d80 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
28d90 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74  .** This variant
28da0 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
28db0 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20  Payload() works 
28dc0 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73  even if the curs
28dd0 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e  or has not.** in
28de0 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49   the CURSOR_VALI
28df0 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20  D state.  It is 
28e00 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
28e10 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
28e20 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ad().** interfac
28e30 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
28e40 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
28e50 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  OB.static SQLITE
28e60 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63  _NOINLINE int ac
28e70 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
28e80 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
28e90 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73  pCur,.  u32 offs
28ea0 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20  et,.  u32 amt,. 
28eb0 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20   void *pBuf.){. 
28ec0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20   int rc;.  if ( 
28ed0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28ee0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
28ef0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28f00 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61  E_ABORT;.  }.  a
28f10 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28f20 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28f30 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52  );.  rc = btreeR
28f40 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
28f50 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65  tion(pCur);.  re
28f60 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61  turn rc ? rc : a
28f70 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
28f80 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
28f90 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  pBuf, 0);.}.int 
28fa0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28fb0 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72  oadChecked(BtCur
28fc0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
28fd0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
28fe0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
28ff0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
29000 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
29010 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72  .    assert( cur
29020 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29030 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74  pCur) );.    ret
29040 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
29050 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
29060 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
29070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
29080 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
29090 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66  Checked(pCur, of
290a0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29  fset, amt, pBuf)
290b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
290c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
290d0 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
290e0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
290f0 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
29100 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
29110 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
29120 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
29130 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
29140 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
29150 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
29160 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
29170 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20  if index btrees 
29180 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
29190 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61  0) and is the da
291a0 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20  ta for.** table 
291b0 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
291c0 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e  ntKey==1). The n
291d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
291e0 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b  f available.** k
291f0 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
29200 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  en into *pAmt.  
29210 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
29220 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72  n the value.** r
29230 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
29240 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   be a valid poin
29250 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
29260 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
29270 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
29280 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
29290 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
292a0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
292b0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
292c0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
292d0 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
292e0 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
292f0 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
29300 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
29310 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
29320 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
29330 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
29340 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
29350 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
29360 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
29370 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
29380 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
29390 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
293a0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
293b0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
293c0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
293d0 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
293e0 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
293f0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
29400 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
29410 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
29420 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
29430 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
29440 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
29450 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
29460 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
29470 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
29480 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
29490 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
294a0 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20  atic const void 
294b0 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
294c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
294d0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
294e0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
294f0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
29500 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20  /.  u32 *pAmt   
29510 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
29520 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
29530 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
29540 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
29550 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20   amt;.  assert( 
29560 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
29570 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
29580 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61 73 73  r->pPage);.  ass
29590 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
295a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
295b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
295c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
295d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
295e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
295f0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29600 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29610 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29620 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
29630 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
29640 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
29650 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
29660 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
29670 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70  pPayload>pCur->p
29680 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43  Page->aData || C
29690 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
296a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
296b0 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d  o.pPayload<pCur-
296c0 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
296d0 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a   ||CORRUPT_DB);.
296e0 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e    amt = pCur->in
296f0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28  fo.nLocal;.  if(
29700 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75 72 2d   amt>(int)(pCur-
29710 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
29720 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
29730 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f  ayload) ){.    /
29740 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f 20 6c  * There is too l
29750 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e 20 74  ittle space on t
29760 68 65 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  he page for the 
29770 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a  expected amount.
29780 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20      ** of local 
29790 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62 61 73  content. Databas
297a0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
297b0 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
297c0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  ( CORRUPT_DB );.
297d0 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c      amt = MAX(0,
297e0 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61   (int)(pCur->pPa
297f0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  ge->aDataEnd - p
29800 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29810 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d  ad));.  }.  *pAm
29820 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20 20  t = (u32)amt;.  
29830 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
29840 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
29850 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
29860 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
29870 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
29880 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
29890 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
298a0 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
298b0 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
298c0 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
298d0 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
298e0 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
298f0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
29900 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
29910 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
29920 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
29930 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
29940 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
29950 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
29960 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
29970 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
29980 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
29990 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
299a0 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
299b0 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
299c0 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
299d0 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
299e0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
299f0 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
29a00 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
29a10 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
29a20 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
29a30 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
29a40 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
29a50 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
29a60 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
29a70 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
29a80 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
29a90 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
29aa0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
29ab0 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42  eePayloadFetch(B
29ac0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
29ad0 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
29ae0 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
29af0 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
29b00 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
29b10 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
29b20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
29b30 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
29b40 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
29b50 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
29b60 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
29b70 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
29b80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
29b90 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
29ba0 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
29bb0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
29bc0 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
29bd0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
29be0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
29bf0 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
29c00 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
29c10 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
29c20 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
29c30 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
29c40 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
29c50 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
29c60 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
29c70 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
29c80 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
29c90 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
29ca0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
29cb0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
29cc0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29cd0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29ce0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
29cf0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29d00 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
29d10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
29d20 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
29d30 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
29d40 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
29d50 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
29d60 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
29d70 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
29d80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29d90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29da0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
29db0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
29dc0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29dd0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
29de0 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
29df0 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  l);.  pCur->aiId
29e00 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
29e10 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75   pCur->ix;.  pCu
29e20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29e30 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70  iPage] = pCur->p
29e40 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78  Page;.  pCur->ix
29e50 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
29e60 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  age++;.  return 
29e70 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
29e80 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
29e90 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2c  ur->pPage, pCur,
29ea0 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
29eb0 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  lags);.}..#ifdef
29ec0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
29ed0 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
29ee0 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
29ef0 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
29f00 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
29f10 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
29f20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
29f30 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
29f40 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
29f50 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
29f60 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
29f70 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
29f80 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
29f90 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
29fa0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
29fb0 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
29fc0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
29fd0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
29fe0 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
29ff0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
2a000 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
2a010 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2a020 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
2a030 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
2a040 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
2a050 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
2a060 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
2a070 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
2a080 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0a0 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
2a0b0 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
2a0c0 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
2a0d0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
2a0e0 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
2a0f0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
2a100 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
2a110 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
2a120 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2a130 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
2a140 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
2a150 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
2a160 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
2a170 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
2a180 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
2a190 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
2a1a0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
2a1b0 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
2a1c0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2a1d0 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
2a1e0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
2a1f0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
2a200 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
2a210 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
2a220 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
2a230 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
2a240 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
2a250 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
2a260 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
2a270 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
2a280 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
2a290 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
2a2a0 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
2a2b0 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
2a2c0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
2a2d0 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
2a2e0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
2a2f0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2a300 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74 28  pLeaf;.  assert(
2a310 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a320 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a330 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2a340 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a350 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2a360 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
2a370 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a380 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
2a390 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
2a3a0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
2a3b0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
2a3c0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2a3d0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2a3e0 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
2a3f0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
2a400 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
2a410 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2a420 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
2a430 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
2a440 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
2a450 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2a460 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2a470 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2a480 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2a490 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
2a4a0 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  >ix = pCur->aiId
2a4b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2a4c0 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75 72  ;.  pLeaf = pCur
2a4d0 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  ->pPage;.  pCur-
2a4e0 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
2a4f0 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50  pPage[--pCur->iP
2a500 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50  age];.  releaseP
2a510 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66  ageNotNull(pLeaf
2a520 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
2a530 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
2a540 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  oint to the root
2a550 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74   page of its b-t
2a560 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ree structure..*
2a570 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  *.** If the tabl
2a580 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20  e has a virtual 
2a590 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
2a5a0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
2a5b0 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ved to point.** 
2a5c0 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  to the virtual r
2a5d0 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64  oot page instead
2a5e0 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72   of the actual r
2a5f0 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c  oot page. A tabl
2a600 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75  e has a.** virtu
2a610 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65  al root page whe
2a620 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  n the actual roo
2a630 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  t page contains 
2a640 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a  no cells and a .
2a650 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20  ** single child 
2a660 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  page. This can o
2a670 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20  nly happen with 
2a680 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
2a690 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a   at page 1..**.*
2a6a0 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
2a6b0 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70  structure is emp
2a6c0 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73  ty, the cursor s
2a6d0 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a  tate is set to .
2a6e0 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ** CURSOR_INVALI
2a6f0 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  D and this routi
2a700 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
2a710 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77 69  E_EMPTY. Otherwi
2a720 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  se,.** the curso
2a730 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
2a740 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  t to the first c
2a750 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
2a760 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76  he root.** (or v
2a770 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
2a780 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
2a790 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2a7a0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
2a7b0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
2a7c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
2a7d0 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
2a7e0 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
2a7f0 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
2a800 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
2a810 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
2a820 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
2a830 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
2a840 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
2a850 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
2a860 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
2a870 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
2a880 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
2a890 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
2a8a0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
2a8b0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
2a8c0 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
2a8d0 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
2a8e0 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
2a8f0 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
2a900 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
2a910 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
2a920 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
2a930 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
2a940 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
2a950 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
2a960 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
2a970 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2a980 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
2a990 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2a9a0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
2a9b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a9c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a9d0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2a9e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a9f0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
2aa00 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2aa10 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
2aa20 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
2aa30 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2aa40 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2aa50 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
2aa60 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
2aa70 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2aa80 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2aa90 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2aaa0 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69  ESEEK || pCur->i
2aab0 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73 65  Page<0 );.  asse
2aac0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2aad0 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  ot>0 || pCur->iP
2aae0 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20  age<0 );..  if( 
2aaf0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
2ab00 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2ab10 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72  iPage ){.      r
2ab20 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
2ab30 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  l(pCur->pPage);.
2ab40 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d 70        while( --p
2ab50 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
2ab60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ab70 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
2ab80 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2ab90 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e]);.      }.   
2aba0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
2abb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2abc0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69  ;.      goto ski
2abd0 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20  p_init;.    }.  
2abe0 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
2abf0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
2ac00 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2ac10 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2ac20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2ac30 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c  ITE_EMPTY;.  }el
2ac40 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2ac50 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31  pCur->iPage==(-1
2ac60 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ) );.    if( pCu
2ac70 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
2ac80 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
2ac90 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2aca0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2acb0 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 20  FAULT ){.       
2acc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2acd0 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
2ace0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  OK );.        re
2acf0 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
2ad00 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
2ad10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
2ad20 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
2ad30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2ad40 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2ad50 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
2ad60 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2ad70 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c  t, &pCur->pPage,
2ad80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ad90 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72           0, pCur
2ada0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
2adb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2adc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2add0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2ade0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2adf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ae00 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
2ae10 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >iPage = 0;.    
2ae20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2ae30 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  = pCur->pPage->i
2ae40 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f  ntKey;.  }.  pRo
2ae50 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
2ae60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
2ae70 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
2ae80 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
2ae90 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
2aea0 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
2aeb0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
2aec0 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
2aed0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
2aee0 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
2aef0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
2af00 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
2af10 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
2af20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
2af30 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
2af40 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
2af50 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2af60 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
2af70 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
2af80 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
2af90 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
2afa0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2afb0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2afc0 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
2afd0 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
2afe0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
2aff0 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
2b000 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2b010 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
2b020 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
2b030 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
2b040 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
2b050 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2b060 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
2b070 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
2b080 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
2b090 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
2b0a0 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
2b0b0 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
2b0c0 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
2b0d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
2b0e0 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
2b0f0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2b100 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
2b110 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
2b120 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2b130 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
2b140 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
2b150 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2b160 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29  AGE(pCur->pPage)
2b170 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74  ;.  }..skip_init
2b180 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  :  .  pCur->ix =
2b190 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
2b1a0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2b1b0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2b1c0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
2b1d0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2b1e0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
2b1f0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
2b200 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
2b210 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
2b220 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b230 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2b240 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
2b250 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
2b260 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
2b270 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
2b280 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
2b290 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2b2a0 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
2b2b0 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
2b2c0 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
2b2d0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2b2e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2b2f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2b300 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2b310 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
2b320 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b330 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2b340 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2b350 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2b360 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  MPTY;.  }.  retu
2b370 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b380 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2b390 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
2b3a0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2b3b0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2b3c0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
2b3d0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2b3e0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
2b3f0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2b400 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
2b410 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
2b420 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
2b430 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
2b440 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2b450 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
2b460 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2b470 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2b480 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b490 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2b4a0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2b4b0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2b4c0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2b4d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b4e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2b4f0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2b500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b510 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
2b520 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
2b530 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2b540 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
2b550 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
2b560 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2b570 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2b580 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >ix));.    rc = 
2b590 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2b5a0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
2b5b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b5c0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2b5d0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
2b5e0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
2b5f0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b600 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
2b610 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2b620 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
2b630 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
2b640 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
2b650 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
2b660 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
2b670 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
2b680 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2b690 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
2b6a0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b6b0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
2b6c0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2b6d0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
2b6e0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2b6f0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
2b700 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
2b710 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2b720 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2b730 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2b740 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
2b750 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
2b760 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2b770 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
2b780 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2b790 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2b7a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b7b0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2b7c0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
2b7d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2b7e0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2b7f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b800 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b810 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
2b820 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
2b830 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2b840 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2b850 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2b860 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2b870 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2b880 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2b890 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
2b8a0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2b8b0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
2b8c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b8d0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
2b8e0 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2b8f0 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
2b900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2b910 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2b920 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2b930 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2b940 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
2b950 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b960 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2b970 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
2b980 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2b990 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2b9a0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2b9b0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2b9c0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2b9d0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2b9e0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2b9f0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2ba00 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2ba10 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2ba20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2ba30 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
2ba40 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2ba50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2ba60 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2ba70 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2ba80 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2ba90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2baa0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2bab0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2bac0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2bad0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2bae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2baf0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2bb00 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2bb10 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2bb20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
2bb30 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2bb40 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2bb50 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2bb60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2bb70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2bb80 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2bb90 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
2bba0 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
2bbb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2bbc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bbd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2bbe0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
2bbf0 63 75 72 73 6f 72 20 70 43 75 72 20 64 6f 65 73  cursor pCur does
2bc00 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20   not point to a 
2bc10 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20 4f 74  valid row..** Ot
2bc20 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72  herwise, if pCur
2bc30 20 69 73 20 76 61 6c 69 64 2c 20 63 6f 6e 66 69   is valid, confi
2bc40 67 75 72 65 20 69 74 20 73 6f 20 74 68 61 74 20  gure it so that 
2bc50 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
2bc60 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
2bc70 4e 65 78 74 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Next() is a no-o
2bc80 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  p..*/.#ifndef SQ
2bc90 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
2bca0 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c 69 74 65  FUNC.void sqlite
2bcb0 33 42 74 72 65 65 53 6b 69 70 4e 65 78 74 28 42  3BtreeSkipNext(B
2bcc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2bcd0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2bce0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2bcf0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
2bd00 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
2bd10 49 50 4e 45 58 54 3b 0a 20 20 20 20 70 43 75 72  IPNEXT;.    pCur
2bd20 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 31 3b 0a  ->skipNext = 1;.
2bd30 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
2bd40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
2bd50 4f 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20 4d 6f  OWFUNC */../* Mo
2bd60 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2bd70 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2bd80 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2bd90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2bda0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2bdb0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2bdc0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2bdd0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2bde0 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2bdf0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2be00 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2be10 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2be20 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
2be30 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2be40 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2be50 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
2be60 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2be70 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2be80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2be90 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2bea0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2beb0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2bec0 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
2bed0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
2bee0 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
2bef0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
2bf00 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
2bf10 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2bf20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2bf30 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
2bf40 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
2bf50 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
2bf60 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
2bf70 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
2bf80 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2bf90 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
2bfa0 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
2bfb0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2bfc0 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
2bfd0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
2bfe0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
2bff0 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
2c000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2c010 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
2c020 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
2c030 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
2c040 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c050 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67  ->ix==pCur->pPag
2c060 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  e->nCell-1 );.  
2c070 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c080 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23  pPage->leaf );.#
2c090 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
2c0a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2c0b0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2c0c0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2c0d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c0e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2c0f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2c100 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a  R_VALID );.    *
2c110 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63  pRes = 0;.    rc
2c120 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
2c130 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  st(pCur);.    if
2c140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c150 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  ){.      pCur->c
2c160 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2c170 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73  AtLast;.    }els
2c180 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e{.      pCur->c
2c190 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2c1a0 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20  _AtLast;.    }. 
2c1b0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2c1c0 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
2c1d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c1e0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2c1f0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2c200 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
2c210 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
2c220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2c230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c240 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2c250 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2c260 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2c270 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2c280 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2c290 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2c2a0 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2c2b0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2c2c0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2c2d0 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2c2e0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2c2f0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2c300 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2c310 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2c320 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2c330 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2c340 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2c350 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2c360 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2c370 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2c380 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2c390 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2c3a0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2c3b0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2c3c0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2c3d0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2c3e0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2c3f0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2c400 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2c410 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2c420 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2c430 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2c440 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2c450 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2c460 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2c470 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2c480 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2c490 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2c4a0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2c4b0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2c4c0 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2c4d0 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2c4e0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2c4f0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2c500 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2c510 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2c520 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2c530 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2c540 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2c550 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2c560 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2c570 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2c580 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2c590 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2c5a0 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2c5b0 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2c5c0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2c5d0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2c5e0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2c5f0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2c600 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2c620 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2c630 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2c640 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2c650 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2c660 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2c670 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2c680 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2c690 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2c6a0 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2c6b0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2c6c0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2c6d0 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2c6e0 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2c6f0 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2c700 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2c710 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2c720 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2c730 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2c740 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2c750 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2c760 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2c770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c780 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2c790 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2c7a0 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2c7b0 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2c7c0 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2c7d0 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2c7e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2c7f0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2c800 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2c810 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2c820 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2c830 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2c840 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c860 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2c870 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2c880 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2c890 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2c8a0 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2c8b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2c8c0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2c8d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2c8e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2c8f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2c900 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2c910 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2c920 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2c930 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2c940 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
2c950 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2c960 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2c970 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
2c980 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
2c990 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
2c9a0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
2c9b0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
2c9c0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
2c9d0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
2c9e0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
2c9f0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
2ca00 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
2ca10 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
2ca20 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
2ca30 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
2ca40 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
2ca50 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2ca60 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2ca70 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
2ca80 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2ca90 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2caa0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2cab0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2cac0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2cad0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2cae0 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
2caf0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
2cb00 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2cb10 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20  AtLast)!=0 ){.  
2cb20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
2cb30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2cb40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2cb50 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
2cb60 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65  the requested ke
2cb70 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  y is one more th
2cb80 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
2cb90 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  key, then.      
2cba0 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68  ** try to get th
2cbb0 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ere using sqlite
2cbc0 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74  3BtreeNext() rat
2cbd0 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a  her than a full.
2cbe0 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20        ** binary 
2cbf0 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73  search.  This is
2cc00 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2cc10 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72   only.  The corr
2cc20 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20  ect answer.     
2cc30 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74   ** is still obt
2cc40 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68  ained without th
2cc50 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20  is case, only a 
2cc60 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77  little more slow
2cc70 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ely */.      if(
2cc80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2cc90 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21 70  +1==intKey && !p
2cca0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
2ccb0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2ccc0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2ccd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2cce0 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  t(pCur, 0);.    
2ccf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cd00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cd10 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
2cd20 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
2cd30 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2cd40 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2cd50 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2cd60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2cd70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cd80 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2cd90 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
2cda0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2cdb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2cdc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2cdd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cde0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2cdf0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
2ce00 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
2ce10 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
2ce20 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
2ce30 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
2ce40 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
2ce50 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
2ce60 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
2ce70 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
2ce80 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2ce90 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
2cea0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2ceb0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2cec0 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
2ced0 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
2cee0 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
2cef0 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
2cf00 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
2cf10 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2cf20 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2cf30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
2cf40 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a  SQLITE_EMPTY ){.
2cf50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2cf60 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2cf70 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  || pCur->pPage->
2cf80 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2cf90 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2cfa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cfb0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2cfc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2cfd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2cfe0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
2cff0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
2d000 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
2d010 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2d020 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2d030 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d040 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20  >pPage->nCell > 
2d050 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2d060 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c  Cur->iPage==0 ||
2d070 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2d080 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e  ->intKey==pCur->
2d090 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61  curIntKey );.  a
2d0a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
2d0b0 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  IntKey || pIdxKe
2d0c0 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
2d0d0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
2d0e0 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67  , idx, c;.    Pg
2d0f0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
2d100 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2d110 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
2d120 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d140 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2d150 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
2d160 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
2d170 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
2d180 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
2d190 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
2d1a0 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
2d1b0 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
2d1c0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
2d1d0 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
2d1e0 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
2d1f0 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
2d200 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
2d210 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
2d220 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
2d230 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
2d240 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
2d250 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
2d260 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
2d270 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
2d280 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
2d290 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
2d2a0 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
2d2b0 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
2d2c0 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
2d2d0 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
2d2e0 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
2d2f0 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
2d300 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
2d310 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
2d320 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2d330 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2d340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2d350 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
2d360 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
2d370 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
2d380 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
2d390 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2d3a0 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20  biasRight==0 || 
2d3b0 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a  biasRight==1 );.
2d3c0 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28      idx = upr>>(
2d3d0 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a  1-biasRight); /*
2d3e0 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
2d3f0 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70   ? upr : (lwr+up
2d400 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75  r)/2; */.    pCu
2d410 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2d420 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72  ;.    if( xRecor
2d430 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  dCompare==0 ){. 
2d440 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2d450 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
2d460 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ey;.        pCel
2d470 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2d480 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2d490 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2d4a0 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
2d4b0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
2d4c0 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
2d4d0 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
2d4e0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
2d4f0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2d500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2d520 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
2d530 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2d540 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2d550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d560 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
2d570 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
2d580 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
2d590 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
2d5a0 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
2d5b0 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
2d5c0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2d5d0 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  { c = -1; break;
2d5e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2d5f0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e   if( nCellKey>in
2d600 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2d610 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2d620 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
2d630 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20  >upr ){ c = +1; 
2d640 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
2d650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d660 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
2d670 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ey==intKey );.  
2d680 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2d690 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2d6a0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2d6b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2d6c0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2d6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2d6e0 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2d6f0 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2d700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d710 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2d720 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2d730 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2d740 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2d750 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
2d760 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2d770 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2d780 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
2d790 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2d7a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d7b0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2d7c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d7d0 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2d7e0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2d7f0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2d800 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2d810 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2d820 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2d830 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2d840 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
2d850 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  l;  /* Size of t
2d860 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e  he pCell cell in
2d870 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2d880 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2d890 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2d8a0 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20   idx);..        
2d8b0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
2d8c0 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
2d8d0 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
2d8e0 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
2d8f0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
2d900 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
2d910 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
2d920 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
2d930 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
2d940 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
2d950 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
2d960 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
2d970 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
2d980 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
2d990 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
2d9a0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
2d9b0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
2d9c0 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
2d9d0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2d9e0 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
2d9f0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
2da00 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
2da10 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
2da20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
2da30 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
2da40 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
2da50 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
2da60 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
2da70 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
2da80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2da90 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
2daa0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
2dab0 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
2dac0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
2dad0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2dae0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
2daf0 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
2db00 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
2db10 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
2db20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
2db30 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2db40 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
2db50 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2db60 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2db70 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2db80 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2db90 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2dba0 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
2dbb0 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2dbc0 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2dbd0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2dbe0 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
2dbf0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2dc00 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
2dc10 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
2dc20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
2dc30 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
2dc40 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
2dc50 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
2dc60 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
2dc70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2dc80 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2dc90 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
2dca0 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2dcb0 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
2dcc0 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2dcd0 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
2dce0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2dcf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2dd00 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
2dd10 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2dd20 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2dd30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2dd40 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2dd50 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
2dd60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2dd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2dd80 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
2dd90 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
2dda0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
2ddb0 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
2ddc0 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
2ddd0 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
2dde0 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
2ddf0 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
2de00 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
2de10 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
2de20 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
2de30 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
2de40 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2de50 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
2de60 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
2de70 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
2de80 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20  called. .       
2de90 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2dea0 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  ** If the record
2deb0 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65   is corrupt, the
2dec0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2ded0 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64  routine may read
2dee0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70  .          ** up
2def0 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20   to two varints 
2df00 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2df10 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65  the buffer. An e
2df20 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20  xtra 18 .       
2df30 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
2df40 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61  adding is alloca
2df50 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ted at the end o
2df60 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a  f the buffer in.
2df70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
2df80 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  e this happens. 
2df90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
2dfa0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
2dfb0 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
2dfc0 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
2dfd0 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
2dfe0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
2dff0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
2e000 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
2e010 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
2e020 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
2e030 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
2e040 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
2e050 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e060 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20  se( nCell<0 );  
2e070 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20   /* True if key 
2e080 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20  size is 2^32 or 
2e090 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  more */.        
2e0a0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2e0b0 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==0 );  /* Inva
2e0c0 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2e0d0 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f  x80 0x80 0x00 */
2e0e0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2e0f0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b  ase( nCell==1 );
2e100 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2e110 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2e120 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20  0 0x01 */.      
2e130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2e140 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69  ell==2 );  /* Mi
2e150 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65  nimum legal inde
2e160 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20  x key size */.  
2e170 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2e180 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<2 ){.         
2e190 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2e1a0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
2e1b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2e1c0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2e1d0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2e1e0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
2e1f0 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
2e200 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a  oc( nCell+18 );.
2e210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2e220 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
2e230 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2e240 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2e250 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2e260 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2e270 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e280 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
2e290 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2e2a0 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
2e2b0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
2e2c0 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
2e2d0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
2e2e0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
2e2f0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2e300 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
2e310 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  fl;.          if
2e320 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2e330 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e340 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2e350 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2e360 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2e370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e380 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2e390 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
2e3a0 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
2e3b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e3c0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2e3d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e3e0 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
2e3f0 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
2e400 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2e410 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
2e420 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
2e430 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2e440 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
2e450 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
2e460 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2e470 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
2e480 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
2e490 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2e4a0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2e4b0 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
2e4c0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2e4d0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2e4e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e4f0 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
2e500 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
2e510 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2e520 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e530 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2e540 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2e550 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
2e560 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
2e570 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2e580 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2e590 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2e5a0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2e5b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
2e5c0 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
2e5d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2e5e0 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
2e5f0 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
2e600 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
2e610 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
2e620 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2e630 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
2e640 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
2e650 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2e660 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
2e670 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2e680 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
2e690 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2e6a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2e6b0 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50  Cur->ix<pCur->pP
2e6c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2e6d0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2e6e0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
2e6f0 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
2e700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e710 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2e720 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
2e730 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2e740 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
2e750 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2e760 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2e770 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2e780 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2e790 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2e7a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
2e7b0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
2e7c0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
2e7d0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
2e7e0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2e7f0 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
2e800 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2e810 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
2e820 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
2e830 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
2e840 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2e850 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ze = 0;.  assert
2e860 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2e870 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
2e880 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  fl)==0 );.  retu
2e890 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2e8a0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2e8b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2e8c0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2e8d0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
2e8e0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2e8f0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2e900 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2e910 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2e920 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2e930 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2e940 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2e950 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2e960 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2e970 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2e980 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2e990 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2e9a0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2e9b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2e9c0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2e9d0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2e9e0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2e9f0 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2ea00 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2ea10 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2ea20 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2ea30 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2ea40 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2ea50 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2ea60 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2ea70 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2ea80 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2ea90 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2eaa0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2eab0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2eac0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2ead0 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69  * Return an esti
2eae0 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d  mate for the num
2eaf0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2eb00 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 43  he table that pC
2eb10 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ur is.** pointin
2eb20 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20  g to.  Return a 
2eb30 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
2eb40 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69  if no estimate i
2eb50 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  s currently .** 
2eb60 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36  available..*/.i6
2eb70 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  4 sqlite3BtreeRo
2eb80 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73  wCountEst(BtCurs
2eb90 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34  or *pCur){.  i64
2eba0 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61   n;.  u8 i;..  a
2ebb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ebc0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ebd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ebe0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ebf0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2ec00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2ec10 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73  * Currently this
2ec20 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e   interface is on
2ec30 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  ly called by the
2ec40 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20   OP_IfSmaller.  
2ec50 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69  ** opcode, and i
2ec60 74 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20  t that case the 
2ec70 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61  cursor will alwa
2ec80 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a  ys be valid and.
2ec90 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73    ** will always
2eca0 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66   point to a leaf
2ecb0 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20   node. */.  if( 
2ecc0 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61  NEVER(pCur->eSta
2ecd0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2ece0 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ) ) return -1;. 
2ecf0 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
2ed00 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29  >pPage->leaf==0)
2ed10 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20   ) return -1;.. 
2ed20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65   n = pCur->pPage
2ed30 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69  ->nCell;.  for(i
2ed40 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
2ed50 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a  e; i++){.    n *
2ed60 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
2ed70 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20  ]->nCell;.  }.  
2ed80 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
2ed90 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
2eda0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
2edb0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2edc0 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74  atabase. .** Ret
2edd0 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a  urn value:.**.**
2ede0 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
2edf0 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20       success.** 
2ee00 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20     SQLITE_DONE  
2ee10 20 20 20 20 63 75 72 73 6f 72 20 69 73 20 61 6c      cursor is al
2ee20 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 61  ready pointing a
2ee30 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  t the last eleme
2ee40 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69  nt.**    otherwi
2ee50 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65 20 6b  se        some k
2ee60 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63  ind of error occ
2ee70 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20  urred.**.** The 
2ee80 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2ee90 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2eea0 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f  Next().  That ro
2eeb0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
2eec0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
2eed0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
2eee0 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ely incrementing
2eef0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
2ef00 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
2ef10 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20  .** to the next 
2ef20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
2ef30 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
2ef40 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78  slower) btreeNex
2ef50 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f  t() helper.** ro
2ef60 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2ef70 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2ef80 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2ef90 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2efa0 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72   or.** to restor
2efb0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2efc0 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20  .** If bit 0x01 
2efd0 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e  of the F argumen
2efe0 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  t in sqlite3Btre
2eff0 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20 31 2c  eNext(C,F) is 1,
2f000 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72   then the.** cur
2f010 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  sor corresponds 
2f020 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
2f030 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
2f040 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2f050 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74  .** skipped if t
2f060 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  he SQL index had
2f070 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69   been a unique i
2f080 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72 67  ndex.  The F arg
2f090 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69  ument.** is a hi
2f0a0 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d  nt to the implem
2f0b0 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62 74 72  ent.  SQLite btr
2f0c0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2f0d0 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  n does not use.*
2f0e0 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74  * this hint, but
2f0f0 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f   COMDB2 does..*/
2f100 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2f110 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2f120 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2f130 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2f140 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2f150 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2f160 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2f170 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2f180 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2f190 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2f1a0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2f1b0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2f1c0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2f1d0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2f1e0 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
2f1f0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2f200 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
2f210 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  fl)==0 );.    rc
2f220 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
2f230 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2f240 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2f260 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2f270 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2f280 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2f290 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65  tate ){.      re
2f2a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
2f2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f2c0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2f2d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2f2e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2f2f0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2f300 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2f310 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
2f320 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2f330 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2f340 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
2f350 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a  ->skipNext>0 ){.
2f360 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
2f370 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2f380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f390 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2f3a0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2f3b0 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
2f3c0 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2f3d0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64 78 20  r->pPage;.  idx 
2f3e0 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20  = ++pCur->ix;.  
2f3f0 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
2f400 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  it ){.    /* The
2f410 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20   only known way 
2f420 66 6f 72 20 74 68 69 73 20 74 6f 20 68 61 70 70  for this to happ
2f430 65 6e 20 69 73 20 66 6f 72 20 74 68 65 72 65 20  en is for there 
2f440 74 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 72  to be a.    ** r
2f450 65 63 75 72 73 69 76 65 20 53 51 4c 20 66 75 6e  ecursive SQL fun
2f460 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20  ction that does 
2f470 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  a DELETE operati
2f480 6f 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 0a  on as part of a.
2f490 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 77 68      ** SELECT wh
2f4a0 69 63 68 20 64 65 6c 65 74 65 73 20 63 6f 6e 74  ich deletes cont
2f4b0 65 6e 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ent out from und
2f4c0 65 72 20 61 6e 20 61 63 74 69 76 65 20 63 75 72  er an active cur
2f4d0 73 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20  sor.    ** in a 
2f4e0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
2f4f0 20 66 69 6c 65 20 77 68 65 72 65 20 74 68 65 20   file where the 
2f500 74 61 62 6c 65 20 62 65 69 6e 67 20 44 45 4c 45  table being DELE
2f510 54 45 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  TE-ed from.    *
2f520 2a 20 68 61 73 20 70 61 67 65 73 20 69 6e 20 63  * has pages in c
2f530 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 74  ommon with the t
2f540 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
2f550 65 64 2e 20 20 53 65 65 20 54 48 33 0a 20 20 20  ed.  See TH3.   
2f560 20 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f   ** module cov1/
2f570 62 74 72 65 65 37 38 2e 74 65 73 74 20 74 65 73  btree78.test tes
2f580 74 63 61 73 65 20 32 32 30 20 28 32 30 31 38 2d  tcase 220 (2018-
2f590 30 36 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20 20  06-08) for an.  
2f5a0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f    ** example. */
2f5b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2f5c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2f5d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2f5e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f5f0 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
2f600 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
2f610 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
2f620 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
2f630 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
2f640 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
2f650 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
2f660 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
2f670 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
2f680 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
2f690 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
2f6a0 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
2f6b0 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
2f6c0 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
2f6d0 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
2f6e0 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
2f6f0 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
2f700 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
2f710 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
2f720 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
2f730 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
2f740 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
2f750 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
2f760 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
2f770 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2f780 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2f790 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2f7a0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2f7b0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2f7c0 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2f7d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2f7e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
2f7f0 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2f800 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2f810 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
2f820 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2f830 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2f840 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2f850 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2f860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f870 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
2f880 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2f890 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
2f8a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2f8b0 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
2f8c0 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e  Cur->ix>=pPage->
2f8d0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
2f8e0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
2f8f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
2f900 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2f910 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65  pCur, 0);.    }e
2f920 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
2f930 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2f940 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61   }.  }.  if( pPa
2f950 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2f960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f970 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2f980 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2f990 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2f9a0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2f9b0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
2f9c0 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73  *pCur, int flags
2f9d0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2f9e0 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  age;.  UNUSED_PA
2f9f0 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29  RAMETER( flags )
2fa00 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f  ;  /* Used in CO
2fa10 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74  MDB2 but not nat
2fa20 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20  ive SQLite */.  
2fa30 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2fa40 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2fa50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
2fa60 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
2fa70 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2fa80 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2fa90 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2faa0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2fab0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2fac0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2fad0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2fae0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2faf0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2fb00 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2fb10 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2fb20 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65  D ) return btree
2fb30 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50  Next(pCur);.  pP
2fb40 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2fb50 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  e;.  if( (++pCur
2fb60 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->ix)>=pPage->nC
2fb70 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
2fb80 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  >ix--;.    retur
2fb90 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2fba0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2fbb0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2fbc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fbd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2fbe0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2fbf0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2fc00 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2fc10 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2fc20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2fc30 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2fc40 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52  e database..** R
2fc50 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a  eturn values:.**
2fc60 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
2fc70 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a  K     success.**
2fc80 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45       SQLITE_DONE
2fc90 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73     the cursor is
2fca0 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20   already on the 
2fcb0 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
2fcc0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
2fcd0 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20    otherwise     
2fce0 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
2fcf0 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
2fd00 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2fd10 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2fd20 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
2fd30 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2fd40 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2fd50 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2fd60 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
2fd70 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2fd80 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2fd90 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2fda0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
2fdb0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2fdc0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2fdd0 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
2fde0 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
2fdf0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2fe00 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2fe10 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2fe20 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2fe30 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
2fe40 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2fe50 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
2fe60 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
2fe70 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74  ent to sqlite3Bt
2fe80 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29  reePrevious(C,F)
2fe90 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74   is 1, then.** t
2fea0 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73  he cursor corres
2feb0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2fec0 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72  index and this r
2fed0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2fee0 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65  e been.** skippe
2fef0 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64  d if the SQL ind
2ff00 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e  ex had been a un
2ff10 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65  ique index.  The
2ff20 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61   F argument is a
2ff30 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20  .** hint to the 
2ff40 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20  implement.  The 
2ff50 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62 74  native SQLite bt
2ff60 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2ff70 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75  on does not.** u
2ff80 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75  se this hint, bu
2ff90 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a  t COMDB2 does..*
2ffa0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
2ffb0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
2ffc0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2ffd0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2ffe0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2fff0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
30000 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
30010 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
30020 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
30030 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
30040 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
30050 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
30060 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
30070 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74  Flags & (BTCF_At
30080 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
30090 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
300a0 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ey))==0 );.  ass
300b0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
300c0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66  nSize==0 );.  if
300d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
300e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
300f0 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
30100 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
30110 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
30120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30130 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30140 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
30150 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
30160 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
30170 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30180 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
30190 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
301a0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
301b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
301c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
301d0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
301e0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
301f0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
30200 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
30210 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
30220 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
30230 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
30240 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
30250 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
30260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30270 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
30280 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
30290 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
302a0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
302b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
302c0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
302d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
302e0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
302f0 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20  Cur->ix;.    rc 
30300 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
30310 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
30320 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
30330 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
30340 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
30350 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
30360 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
30370 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
30380 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a   pCur->ix==0 ){.
30390 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
303a0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
303b0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
303c0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
303d0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
303e0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
303f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
30400 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
30410 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
30420 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
30430 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
30440 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
30450 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61  Flags & (BTCF_Va
30460 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a  lidOvfl))==0 );.
30470 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b  .    pCur->ix--;
30480 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
30490 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66  r->pPage;.    if
304a0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
304b0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
304c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
304d0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
304e0 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  us(pCur, 0);.   
304f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
30500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30510 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
30520 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
30530 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
30540 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
30550 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
30560 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
30570 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
30580 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
30590 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
305a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
305b0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
305c0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
305d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
305e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
305f0 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
30600 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
30610 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
30620 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72  SQLite */.  pCur
30630 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
30640 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
30650 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
30660 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
30670 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
30680 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
30690 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
306a0 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
306b0 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  >ix==0.   || pCu
306c0 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  r->pPage->leaf==
306d0 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
306e0 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  n btreePrevious(
306f0 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pCur);.  }.  pCu
30700 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72  r->ix--;.  retur
30710 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
30720 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
30730 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
30740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30750 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
30760 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
30770 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
30780 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
30790 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
307a0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
307b0 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
307c0 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
307d0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
307e0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
307f0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
30800 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
30810 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
30820 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
30830 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
30840 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
30850 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
30860 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
30870 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
30880 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
30890 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
308a0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
308b0 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
308c0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
308d0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
308e0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
308f0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
30900 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
30910 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
30920 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
30930 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
30940 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
30950 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
30960 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
30970 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
30980 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
30990 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
309a0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
309b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
309c0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
309d0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
309e0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
309f0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
30a00 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
30a10 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
30a20 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
30a30 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
30a40 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
30a50 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
30a60 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
30a70 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
30a80 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
30a90 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
30aa0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
30ab0 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
30ac0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
30ad0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
30ae0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
30af0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
30b00 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
30b10 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
30b20 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
30b30 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
30b40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
30b50 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
30b60 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
30b70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
30b80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
30b90 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
30ba0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
30bb0 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
30bc0 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
30bd0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
30be0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
30bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
30c00 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
30c10 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
30c20 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
30c30 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
30c40 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
30c50 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
30c60 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
30c70 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
30c80 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
30c90 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
30ca0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
30cb0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
30cc0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
30cd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
30ce0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
30cf0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
30d00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
30d10 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
30d20 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
30d30 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
30d40 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
30d50 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
30d60 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
30d70 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
30d80 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
30d90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
30da0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
30db0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
30dc0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
30dd0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
30de0 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
30df0 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
30e00 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
30e10 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
30e20 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
30e30 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
30e40 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
30e50 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  t);.  /* EVIDENC
30e60 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32  E-OF: R-05119-02
30e70 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62  637 The 4-byte b
30e80 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
30e90 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20  r at offset 36. 
30ea0 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65   ** stores store
30eb0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
30ec0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
30ed0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a  he freelist. */.
30ee0 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
30ef0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
30f00 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
30f10 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
30f20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29   if( n>=mxPage )
30f30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
30f40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30f50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
30f60 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
30f70 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
30f80 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
30f90 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
30fa0 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
30fb0 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
30fc0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
30fd0 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
30fe0 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
30ff0 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
31000 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53  y' */.    u32 nS
31010 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20  earch = 0;   /* 
31020 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  Count of the num
31030 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74  ber of search at
31040 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20  tempts */.    . 
31050 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
31060 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
31070 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
31080 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
31090 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
310a0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
310b0 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
310c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
310d0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
310e0 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
310f0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
31100 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
31110 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
31120 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31130 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
31140 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
31150 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
31160 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
31170 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
31180 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31190 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
311a0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
311b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
311c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
311d0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
311e0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
311f0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
31200 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
31210 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
31220 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
31230 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
31240 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
31250 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31260 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
31270 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
31280 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
31290 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
312a0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
312b0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
312c0 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
312d0 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
312e0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
312f0 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
31300 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
31310 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
31320 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
31330 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
31340 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31350 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
31360 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
31370 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
31380 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
31390 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
313a0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
313b0 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
313c0 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
313d0 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
313e0 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
313f0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
31400 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
31410 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
31420 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
31430 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
31440 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
31450 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
31460 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
31470 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
31480 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
31490 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
314a0 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
314b0 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
314c0 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
314d0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
314e0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
314f0 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
31500 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
31510 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
31520 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30  -OF: R-01506-110
31530 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  53 The first int
31540 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
31550 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
31560 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
31570 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
31580 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74  he next freelist
31590 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
315a0 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20  he list or.     
315b0 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68     ** zero if th
315c0 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66  is is the last f
315d0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
315e0 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ge. */.        i
315f0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
31600 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
31610 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
31620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
31630 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
31640 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20  59841-13798 The 
31650 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
31660 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
31670 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a  set 32.        *
31680 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67  * stores the pag
31690 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
316a0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
316b0 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a  e freelist, or z
316c0 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a  ero if.        *
316d0 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  * the freelist i
316e0 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  s empty. */.    
316f0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
31700 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31710 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
31720 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
31730 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
31740 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
31750 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20  Trunk>mxPage || 
31760 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b  nSearch++ > n ){
31770 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31780 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
31790 4f 28 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70  O(pPrevTrunk ? p
317a0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20  PrevTrunk->pgno 
317b0 3a 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 1);.      }els
317c0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
317d0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
317e0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
317f0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
31800 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
31810 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
31820 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
31830 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
31840 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
31850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31860 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20  Trunk!=0 );.    
31870 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
31880 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20  ->aData!=0 );.  
31890 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
318a0 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39  OF: R-13523-0439
318b0 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74  4 The second int
318c0 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
318d0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
318e0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75      ** is the nu
318f0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
31900 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f  e pointers to fo
31910 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b  llow. */.      k
31920 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
31930 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
31940 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
31950 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
31960 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
31970 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
31980 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
31990 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
319a0 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
319b0 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
319c0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
319d0 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
319e0 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
319f0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
31a00 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
31a10 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
31a20 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
31a30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31a40 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
31a50 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
31a60 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
31a70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
31a80 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
31a90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31aa0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
31ab0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
31ac0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
31ad0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
31ae0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
31af0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
31b00 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
31b10 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
31b20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
31b30 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
31b40 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
31b50 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
31b60 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
31b70 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
31b80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
31b90 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
31ba0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
31bb0 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
31bc0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
31bd0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
31be0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
31bf0 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
31c00 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
31c10 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
31c20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31c30 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31c40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
31c50 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20   searchList .   
31c60 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61           && (nea
31c70 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28  rby==iTrunk || (
31c80 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26  iTrunk<nearby &&
31c90 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31ca0 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  LE)) .      ){. 
31cb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
31cc0 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
31cd0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
31ce0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
31cf0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
31d00 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
31d10 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
31d20 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
31d30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
31d40 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
31d50 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70  runk;.        *p
31d60 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
31d70 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
31d80 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
31d90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31da0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
31db0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
31dc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
31dd0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31de0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
31df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
31e00 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
31e10 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
31e20 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
31e30 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
31e40 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
31e50 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
31e60 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
31e70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31e80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31e90 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
31ea0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
31eb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
31ec0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
31ee0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
31ef0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
31f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
31f10 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
31f20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
31f30 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
31f40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
31f50 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
31f60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
31f70 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
31f80 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
31f90 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
31fa0 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
31fb0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
31fc0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
31fd0 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
31fe0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
31ff0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
32000 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
32010 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
32020 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
32030 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
32040 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
32050 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
32060 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
32070 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
32080 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
32090 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
320a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
320b0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72  CORRUPT_PGNO(iTr
320c0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
320d0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
320e0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
320f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32100 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
32110 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
32120 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
32130 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
32140 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
32150 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
32160 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
32170 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32180 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
32190 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
321a0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
321b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
321c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
321d0 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
321e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
321f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32200 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
32210 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
32220 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
32230 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32240 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32260 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
32270 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
32280 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
32290 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
322a0 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
322b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
322c0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
322d0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
322e0 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
322f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
32300 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
32310 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32320 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
32330 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
32340 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
32350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
32360 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
32370 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
32380 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
32390 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
323a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
323b0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
323c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
323d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
323e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
323f0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
32400 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32410 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
32420 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
32430 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
32440 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
32450 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
32460 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
32470 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
32480 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
32490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
324a0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
324b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
324c0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
324d0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
324e0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
324f0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
32500 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
32510 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
32520 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
32530 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
32540 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
32550 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
32560 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
32570 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
32580 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
32590 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
325a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
325b0 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
325c0 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
325d0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
325e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
325f0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
32600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32610 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
32620 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
32630 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
32640 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
32650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
32660 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72   if( iPage<=near
32670 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
32680 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
32690 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
326a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
326b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
326c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
326d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
326e0 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
326f0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
32700 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
32710 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
32720 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
32730 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
32740 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
32750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
32760 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
32770 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
32780 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
32790 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
327a0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
327b0 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
327c0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
327d0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
327e0 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
327f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
32800 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
32810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32830 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
32840 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
32850 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
32860 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
32870 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
32880 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
32890 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
328a0 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
328b0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
328c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
328d0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75  ORRUPT_PGNO(iTru
328e0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  nk);.          g
328f0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
32900 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
32910 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
32920 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
32930 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
32940 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20  !searchList .   
32950 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d        || (iPage=
32960 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67  =nearby || (iPag
32970 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  e<nearby && eMod
32980 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
32990 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
329a0 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
329b0 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
329c0 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
329d0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
329e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
329f0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
32a00 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
32a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
32a20 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
32a30 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
32a40 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
32a50 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
32a60 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
32a70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
32a80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32a90 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
32aa0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32ab0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
32ac0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32ae0 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
32af0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
32b00 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
32b10 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
32b20 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
32b30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32b40 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
32b50 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
32b60 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
32b70 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
32b80 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
32b90 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
32ba0 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20  NTENT : 0;.     
32bb0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
32bc0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
32bd0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
32be0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
32bf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
32c00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32c10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
32c20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32c30 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
32c40 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
32c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32c60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32c70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
32c80 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
32c90 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
32ca0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
32cb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
32cc0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
32cd0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
32ce0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
32cf0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
32d00 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
32d10 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
32d20 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
32d30 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
32d40 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
32d50 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
32d60 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
32d70 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
32d80 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
32d90 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
32da0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
32db0 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
32dc0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
32dd0 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
32de0 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
32df0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
32e00 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
32e10 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
32e20 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
32e30 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
32e40 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
32e50 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
32e60 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
32e70 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
32e80 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
32e90 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
32ea0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
32eb0 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
32ec0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
32ed0 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
32ee0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
32ef0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
32f00 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
32f10 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
32f20 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
32f30 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
32f40 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
32f50 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
32f60 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
32f70 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
32f80 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
32f90 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
32fa0 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
32fb0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
32fc0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
32fd0 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
32fe0 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
32ff0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
33000 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
33010 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
33020 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
33030 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
33040 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
33050 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
33060 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
33070 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
33080 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
33090 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
330a0 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
330b0 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
330c0 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
330d0 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
330e0 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
330f0 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
33100 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
33110 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
33120 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
33130 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
33140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
33150 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
33160 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
33170 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
33180 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
33190 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
331a0 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
331b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
331c0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
331d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
331e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
331f0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
33200 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
33210 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
33220 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
33230 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
33240 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33250 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33260 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33270 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
33280 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
33290 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
332a0 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
332b0 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
332c0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
332d0 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
332e0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
332f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
33300 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
33310 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
33320 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
33330 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
33340 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
33350 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
33360 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
33370 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
33380 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
33390 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
333a0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
333b0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
333c0 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
333d0 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
333e0 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
333f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
33400 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
33410 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
33420 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
33430 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
33440 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
33450 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  g, bNoContent);.
33460 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33490 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
334a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
334b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
334c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
334d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
334e0 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
334f0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
33500 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
33510 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33520 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
33530 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
33540 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
33550 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
33560 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
33570 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
33580 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
33590 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
335a0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
335b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
335c0 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
335d0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
335e0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
335f0 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e  pPage, bNoConten
33600 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
33610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33620 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33630 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
33640 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33660 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
33670 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
33680 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
33690 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52   0;.    }.    TR
336a0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
336b0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
336c0 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
336d0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
336e0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
336f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
33700 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
33710 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
33720 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
33730 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
33740 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72  vTrunk);.  asser
33750 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
33760 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
33770 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
33780 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
33790 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=1 );.  assert(
337a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
337b0 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  | (*ppPage)->isI
337c0 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  nit==0 );.  retu
337d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
337e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
337f0 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
33800 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
33810 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
33820 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
33830 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
33840 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
33850 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
33860 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
33870 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
33880 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
33890 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
338a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
338b0 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
338c0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
338d0 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
338e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
338f0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
33900 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
33910 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
33920 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
33930 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
33940 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
33950 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
33960 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
33970 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
33980 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
33990 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
339a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
339b0 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
339c0 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
339d0 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
339e0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
339f0 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
33a00 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
33a10 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
33a20 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
33a30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
33a40 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
33a50 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
33a60 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
33a70 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
33a80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33a90 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
33aa0 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
33ab0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
33ac0 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
33ad0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
33ae0 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
33af0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
33b00 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
33b10 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
33b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33b30 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
33b40 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
33b50 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
33b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
33b80 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
33b90 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
33ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33bb0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
33bc0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
33bd0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
33be0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33bf0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
33c00 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
33c10 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
33c20 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  | iPage>1 );.  a
33c30 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
33c40 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
33c50 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
33c60 69 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65  if( iPage<2 ) re
33c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
33c80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20  UPT_BKPT;.  if( 
33c90 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
33ca0 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
33cb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
33cc0 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
33cd0 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
33ce0 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
33cf0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
33d00 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
33d10 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
33d20 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
33d30 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
33d40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33d50 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
33d60 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
33d70 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
33d80 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
33d90 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
33da0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
33db0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
33dc0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
33dd0 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70  ree+1);..  if( p
33de0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
33df0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
33e00 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
33e10 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
33e20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
33e30 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
33e40 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
33e50 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
33e60 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
33e70 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
33e80 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
33e90 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
33ea0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
33eb0 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
33ec0 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
33ed0 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
33ee0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33ef0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
33f00 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
33f10 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
33f20 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
33f30 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
33f40 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
33f50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
33f60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
33f70 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
33f80 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
33f90 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
33fa0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
33fb0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
33fc0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
33fd0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
33fe0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
33ff0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
34000 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
34010 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26  P_FREEPAGE, 0, &
34020 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
34030 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
34040 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
34050 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
34060 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
34070 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
34080 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
34090 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
340a0 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
340b0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
340c0 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
340d0 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
340e0 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
340f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
34100 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
34110 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
34120 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
34130 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
34140 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
34150 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
34160 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
34170 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
34180 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
34190 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
341a0 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
341b0 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
341c0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
341d0 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
341e0 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
341f0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
34200 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61   ){.    u32 nLea
34210 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
34220 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
34230 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
34240 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
34250 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
34260 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
34270 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
34280 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
34290 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
342a0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
342b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
342c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
342d0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
342e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
342f0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
34300 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
34310 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
34320 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20  ->usableSize>32 
34330 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
34340 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   > (u32)pBt->usa
34350 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
34360 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
34370 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34380 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
34390 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
343a0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20      if( nLeaf < 
343b0 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
343c0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
343d0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
343e0 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
343f0 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
34400 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
34410 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
34420 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
34430 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
34440 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
34450 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
34460 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
34470 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
34480 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
34490 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
344a0 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
344b0 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
344c0 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
344d0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
344e0 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
344f0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
34500 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
34510 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
34520 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
34530 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
34540 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
34550 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
34560 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
34570 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
34580 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
34590 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
345a0 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
345b0 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
345c0 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
345d0 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
345e0 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
345f0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
34600 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
34610 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74  inue to restrict
34620 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
34630 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
34640 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
34650 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
34660 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
34670 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
34680 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
34690 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
346a0 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
346b0 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
346c0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
346d0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
346e0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
346f0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
34700 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
34710 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
34720 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
34730 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
34740 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f  R-19920-11576 Ho
34750 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72  wever, newer ver
34760 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
34770 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61  still.      ** a
34780 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c  void using the l
34790 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20  ast six entries 
347a0 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  in the freelist 
347b0 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79  trunk page array
347c0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
347d0 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65  er that database
347e0 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62   files created b
347f0 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
34800 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62   of SQLite can b
34810 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  e.      ** read 
34820 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
34830 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20  s of SQLite..   
34840 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
34850 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34860 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
34870 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
34880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34890 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
348a0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
348b0 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
348c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
348d0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
348e0 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
348f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
34900 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73  age && (pBt->bts
34910 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
34920 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  RE_DELETE)==0 ){
34930 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
34940 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
34950 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34970 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
34980 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
34990 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
349a0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
349b0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
349c0 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
349d0 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
349e0 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
349f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
34a00 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
34a10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
34a20 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
34a30 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
34a40 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
34a50 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
34a60 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
34a70 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
34a80 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
34a90 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
34aa0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
34ab0 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
34ac0 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
34ad0 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
34ae0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
34af0 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
34b00 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
34b10 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
34b20 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
34b30 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
34b40 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
34b50 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
34b60 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
34b70 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
34b80 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
34b90 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
34ba0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
34bb0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
34bc0 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
34bd0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34be0 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
34bf0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34c00 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
34c10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
34c20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
34c30 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
34c40 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
34c50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
34c60 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
34c70 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
34c80 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
34c90 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34ca0 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
34cb0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
34cc0 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
34cd0 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
34ce0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
34cf0 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
34d00 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
34d10 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
34d20 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
34d30 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
34d40 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
34d50 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
34d60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34d70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
34d80 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
34d90 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
34da0 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
34db0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34dc0 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
34dd0 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
34de0 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
34df0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
34e00 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
34e10 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
34e20 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
34e30 20 43 65 6c 6c 2e 20 20 53 74 6f 72 65 0a 2a 2a   Cell.  Store.**
34e40 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   size informatio
34e50 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c  n about the cell
34e60 20 69 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a 73 74   in pInfo..*/.st
34e70 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
34e80 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
34e90 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
34ea0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
34eb0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
34ec0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
34ed0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
34ee0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
34ef0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43   the Cell */.  C
34f00 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
34f10 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
34f20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
34f30 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b  t the cell */.){
34f40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
34f50 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
34f60 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
34f70 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
34f80 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
34f90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34fa0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
34fb0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
34fc0 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
34fd0 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
34fe0 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66  ll, pInfo);.  if
34ff0 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d  ( pInfo->nLocal=
35000 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  =pInfo->nPayload
35010 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
35020 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
35030 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
35040 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
35050 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
35060 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  /.  }.  testcase
35070 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d  ( pCell + pInfo-
35080 3e 6e 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 2d  >nSize == pPage-
35090 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 74  >aDataEnd );.  t
350a0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b  estcase( pCell +
350b0 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31   (pInfo->nSize-1
350c0 29 20 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ) == pPage->aDat
350d0 61 45 6e 64 20 29 3b 0a 20 20 69 66 28 20 70 43  aEnd );.  if( pC
350e0 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69  ell + pInfo->nSi
350f0 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  ze > pPage->aDat
35100 61 45 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20 43  aEnd ){.    /* C
35110 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
35120 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
35130 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35140 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
35150 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 6f 76 66  Page);.  }.  ovf
35160 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
35170 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e  (pCell + pInfo->
35180 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 70 42  nSize - 4);.  pB
35190 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
351a0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
351b0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
351c0 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
351d0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
351e0 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
351f0 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
35200 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  d - pInfo->nLoca
35210 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
35220 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
35230 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  ze;.  assert( nO
35240 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43  vfl>0 || .    (C
35250 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70 49  ORRUPT_DB && (pI
35260 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20  nfo->nPayload + 
35270 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
35280 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
35290 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
352a0 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
352b0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
352c0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
352d0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
352e0 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
352f0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
35300 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
35310 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
35320 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
35330 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
35340 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
35350 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
35360 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
35370 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
35380 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
35390 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
353a0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
353b0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
353c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
353d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
353e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
353f0 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
35400 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
35410 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
35420 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
35430 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
35440 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
35450 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
35460 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
35470 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
35480 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
35490 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
354a0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
354b0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
354c0 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
354d0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
354e0 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
354f0 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
35500 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
35510 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
35520 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
35530 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
35540 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
35550 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
35560 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
35570 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
35580 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
35590 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
355a0 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
355b0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
355c0 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
355d0 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
355e0 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
355f0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
35600 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
35610 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
35620 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
35630 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
35640 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
35650 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
35660 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
35670 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
35680 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
35690 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
356a0 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
356b0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
356c0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
356d0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
356e0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
356f0 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
35700 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
35710 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
35720 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
35730 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
35740 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
35760 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
35770 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
35780 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
35790 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
357a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
357b0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
357c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
357d0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
357e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
357f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
35800 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
35810 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
35820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
35830 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
35840 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
35850 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
35860 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
35870 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
35880 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
35890 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
358a0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
358b0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
358c0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
358d0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
358e0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
358f0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
35900 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
35910 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
35920 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
35930 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
35940 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
35950 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
35960 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
35970 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
35980 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
35990 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
359a0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
359b0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
359c0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
359d0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
359e0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
359f0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
35a00 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
35a10 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
35a20 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
35a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35a40 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
35a50 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
35a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35a70 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
35a80 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
35a90 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
35aa0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
35ab0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
35ac0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
35ad0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65   */.  const Btre
35ae0 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20  ePayload *pX,   
35af0 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20       /* Payload 
35b00 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f  with which to co
35b10 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c  nstruct the cell
35b20 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
35b30 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
35b40 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
35b50 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
35b60 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
35b70 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
35b80 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
35b90 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20 69 6e   n, rc, mn;.  in
35ba0 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
35bb0 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
35bc0 73 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  se;.  unsigned c
35bd0 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
35be0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
35bf0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
35c00 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ed *pBt;.  Pgno 
35c10 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e 74 20  pgnoOvfl;.  int 
35c20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65  nHeader;..  asse
35c30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35c40 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
35c50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
35c60 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
35c70 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
35c80 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
35c90 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
35ca0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
35cb0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
35cc0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
35cd0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
35ce0 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
35cf0 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
35d00 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
35d10 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
35d20 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  ->pBt->pageSize]
35d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
35d40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
35d50 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
35d60 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
35d70 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
35d80 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
35d90 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  r = pPage->child
35da0 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  PtrSize;.  if( p
35db0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
35dc0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70      nPayload = p
35dd0 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e  X->nData + pX->n
35de0 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d  Zero;.    pSrc =
35df0 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20   pX->pData;.    
35e00 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61  nSrc = pX->nData
35e10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
35e20 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
35e30 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c  ); /* fillInCell
35e40 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  () only called f
35e50 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20  or leaves */.   
35e60 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
35e70 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
35e80 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
35e90 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20  d);.    nHeader 
35ea0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
35eb0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
35ec0 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b  u64*)&pX->nKey);
35ed0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
35ee0 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d  sert( pX->nKey<=
35ef0 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70 58  0x7fffffff && pX
35f00 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20  ->pKey!=0 );.   
35f10 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64   nSrc = nPayload
35f20 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79   = (int)pX->nKey
35f30 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
35f40 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64  >pKey;.    nHead
35f50 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
35f60 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
35f70 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
35f80 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  }.  .  /* Fill i
35f90 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
35fa0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
35fb0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
35fc0 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
35fd0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
35fe0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
35ff0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
36000 20 77 68 65 72 65 20 65 76 65 72 79 74 68 69 6e   where everythin
36010 67 20 66 69 74 73 20 6f 6e 20 74 68 65 20 62 74  g fits on the bt
36020 72 65 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  ree page.    ** 
36030 61 6e 64 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  and no overflow 
36040 70 61 67 65 73 20 61 72 65 20 72 65 71 75 69 72  pages are requir
36050 65 64 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d 20 6e  ed. */.    n = n
36060 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61  Header + nPayloa
36070 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  d;.    testcase(
36080 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73   n==3 );.    tes
36090 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20  tcase( n==4 );. 
360a0 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d     if( n<4 ) n =
360b0 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   4;.    *pnSize 
360c0 3d 20 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = n;.    assert(
360d0 20 6e 53 72 63 3c 3d 6e 50 61 79 6c 6f 61 64 20   nSrc<=nPayload 
360e0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
360f0 20 6e 53 72 63 3c 6e 50 61 79 6c 6f 61 64 20 29   nSrc<nPayload )
36100 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
36110 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 53 72  yload, pSrc, nSr
36120 63 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  c);.    memset(p
36130 50 61 79 6c 6f 61 64 2b 6e 53 72 63 2c 20 30 2c  Payload+nSrc, 0,
36140 20 6e 50 61 79 6c 6f 61 64 2d 6e 53 72 63 29 3b   nPayload-nSrc);
36150 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
36160 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
36170 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
36180 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
36190 73 20 74 68 61 74 20 73 6f 6d 65 20 6f 66 20 74  s that some of t
361a0 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  he content will 
361b0 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 73 70 69  need.  ** to spi
361c0 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll onto overflow
361d0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 6d   pages..  */.  m
361e0 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
361f0 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20 2b 20  cal;.  n = mn + 
36200 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20  (nPayload - mn) 
36210 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
36220 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
36230 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
36240 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
36250 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
36260 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
36270 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 20 3e 20  +1 );.  if( n > 
36280 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
36290 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70 61 63  ) n = mn;.  spac
362a0 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 2a 70 6e  eLeft = n;.  *pn
362b0 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64  Size = n + nHead
362c0 65 72 20 2b 20 34 3b 0a 20 20 70 50 72 69 6f 72  er + 4;.  pPrior
362d0 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
362e0 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c 65 61  r+n];.  pToRelea
362f0 73 65 20 3d 20 30 3b 0a 20 20 70 67 6e 6f 4f 76  se = 0;.  pgnoOv
36300 66 6c 20 3d 20 30 3b 0a 20 20 70 42 74 20 3d 20  fl = 0;.  pBt = 
36310 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 2f  pPage->pBt;..  /
36320 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
36330 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64  variables should
36340 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f   be set as follo
36350 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
36360 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  nPayload        
36370 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64     Total payload
36380 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20   size in bytes. 
36390 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20   **   pPayload  
363a0 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77           Begin w
363b0 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68  riting payload h
363c0 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65  ere.  **   space
363d0 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70  Left          Sp
363e0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74  ace available at
363f0 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e   pPayload.  If n
36400 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66  Payload>spaceLef
36410 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t,.  **         
36420 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
36430 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20  t means content 
36440 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20  must spill into 
36450 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
36460 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20    **   *pnSize  
36470 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f            Size o
36480 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c  f the local cell
36490 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f   (not counting o
364a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20  verflow pages). 
364b0 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20   **   pPrior    
364c0 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74           Where t
364d0 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f  o write the pgno
364e0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
364f0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a  erflow page.  **
36500 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c  .  ** Use a call
36510 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
36520 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66  llPtr() to verif
36530 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  y that the value
36540 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72  s above.  ** wer
36550 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65  e computed corre
36560 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ctly..  */.#ifde
36570 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
36580 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20   {.    CellInfo 
36590 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  info;.    pPage-
365a0 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
365b0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
365c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48  ;.    assert( nH
365d0 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66  eader==(int)(inf
365e0 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65  o.pPayload - pCe
365f0 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ll) );.    asser
36600 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58  t( info.nKey==pX
36610 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73  ->nKey );.    as
36620 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d  sert( *pnSize ==
36630 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20   info.nSize );. 
36640 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65     assert( space
36650 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f  Left == info.nLo
36660 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  cal );.  }.#endi
36670 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  f..  /* Write th
36680 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74  e payload into t
36690 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e  he local Cell an
366a0 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f  d any extra into
366b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
366c0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
366d0 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
366e0 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
366f0 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
36700 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
36710 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
36720 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
36730 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
36740 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
36750 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
36760 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
36770 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
36780 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
36790 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
367a0 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
367b0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
367c0 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
367d0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
367e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
367f0 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
36800 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
36810 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
36820 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
36830 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
36840 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
36850 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
36860 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
36870 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
36880 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
36890 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
368a0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
368b0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
368c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
368d0 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 3d  ..    if( nSrc>=
368e0 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  n ){.      memcp
368f0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
36900 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , n);.    }else 
36910 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
36920 20 20 20 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20      n = nSrc;.  
36930 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
36940 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
36950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36960 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
36970 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
36980 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
36990 0a 20 20 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  .    if( nPayloa
369a0 64 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d<=0 ) break;.  
369b0 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
369c0 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
369d0 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
369e0 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
369f0 6e 3b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  n;.    if( space
36a00 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Left==0 ){.     
36a10 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
36a20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
36a30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
36a40 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
36a50 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
36a60 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
36a70 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
36a80 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
36a90 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
36aa0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
36ab0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
36ac0 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
36ad0 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
36ae0 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
36af0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
36b00 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
36b10 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
36b20 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
36b30 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
36b40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
36b50 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
36b60 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
36b70 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
36b80 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
36b90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
36ba0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
36bb0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
36bc0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
36bd0 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
36be0 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
36bf0 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
36c00 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
36c10 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
36c20 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
36c30 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
36c40 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
36c50 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
36c60 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
36c70 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
36c80 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
36c90 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
36ca0 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
36cb0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
36cc0 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
36cd0 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
36ce0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
36cf0 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
36d00 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
36d10 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
36d20 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
36d30 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
36d40 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
36d50 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
36d60 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c  ninitialized val
36d70 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
36d80 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
36d90 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
36da0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
36db0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
36dc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
36dd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36de0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
36df0 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
36e00 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
36e10 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
36e20 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
36e30 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
36e40 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
36e50 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
36e60 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
36e70 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
36e80 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
36e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36ea0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
36eb0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
36ec0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
36ed0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
36ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36ef0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
36f00 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
36f10 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
36f20 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
36f30 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
36f40 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
36f50 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
36f60 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
36f70 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
36f80 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
36f90 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
36fa0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
36fb0 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
36fc0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
36fd0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
36fe0 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
36ff0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
37000 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
37010 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
37020 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
37030 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
37040 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
37050 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
37060 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
37070 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
37080 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
37090 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
370a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
370b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
370c0 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
370d0 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
370e0 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
370f0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
37100 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
37110 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
37120 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
37130 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
37140 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
37150 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
37160 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
37170 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
37180 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
37190 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
371a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
371b0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
371c0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
371d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
371e0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
371f0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
37200 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
37210 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
37220 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
37230 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
37240 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
37250 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
37260 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
37270 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
37280 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
37290 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
372a0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
372b0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
372c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
372d0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
372e0 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
372f0 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
37300 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
37310 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
37320 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
37330 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
37340 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
37350 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
37360 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
37370 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
37380 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
37390 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
373a0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
373b0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
373c0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
373d0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
373e0 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
373f0 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
37400 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
37410 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
37420 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
37430 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   hdr;        /* 
37440 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  Beginning of the
37450 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74   header.  0 most
37460 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67   pages.  100 pag
37470 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  e 1 */..  if( *p
37480 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
37490 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
374a0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
374b0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  l );.  assert( C
374c0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d  ORRUPT_DB || sz=
374d0 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
374e0 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
374f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
37500 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
37510 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
37520 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
37530 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
37540 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
37550 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
37560 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
37570 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
37580 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
37590 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
375a0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
375b0 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
375c0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
375d0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
375e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
375f0 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
37600 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
37610 20 20 69 66 28 20 70 63 2b 73 7a 20 3e 20 70 50    if( pc+sz > pP
37620 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
37630 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
37640 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
37650 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
37660 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
37670 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
37680 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
37690 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
376a0 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
376b0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
376c0 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67  ll--;.  if( pPag
376d0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
376e0 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
376f0 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
37700 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
37710 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65   0;.    put2byte
37720 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
37730 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
37740 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
37750 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65  e->nFree = pPage
37760 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37770 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  e - pPage->hdrOf
37780 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20  fset.           
37790 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50              - pP
377a0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
377b0 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e - 8;.  }else{.
377c0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c      memmove(ptr,
377d0 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65   ptr+2, 2*(pPage
377e0 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b  ->nCell - idx));
377f0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
37800 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
37810 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70  e->nCell);.    p
37820 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
37830 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
37840 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
37850 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
37860 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
37870 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
37880 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
37890 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
378a0 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
378b0 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
378c0 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
378d0 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
378e0 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
378f0 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
37900 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
37910 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
37920 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
37930 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
37940 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
37950 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
37960 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
37970 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61  Page->apOvfl[] a
37980 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
37990 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
379a0 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
379b0 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
379c0 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
379d0 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
379e0 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
379f0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
37a00 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
37a10 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
37a20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
37a30 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
37a40 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
37a50 2a 70 52 43 20 6d 75 73 74 20 62 65 20 53 51 4c  *pRC must be SQL
37a60 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
37a70 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
37a80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
37a90 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  id insertCell(. 
37aa0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
37ab0 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
37ac0 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
37ad0 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
37ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37af0 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
37b00 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
37b10 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
37b20 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
37b30 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
37b40 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
37b50 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
37b60 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
37b70 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
37b80 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
37b90 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
37ba0 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
37bb0 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
37bc0 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  d */.  Pgno iChi
37bd0 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  ld,      /* If n
37be0 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65  on-zero, replace
37bf0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77   first 4 bytes w
37c00 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a  ith this value *
37c10 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20  /.  int *pRC    
37c20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e        /* Read an
37c30 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63  d write return c
37c40 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f  ode from here */
37c50 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20  .){.  int idx = 
37c60 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  0;      /* Where
37c70 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
37c80 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
37c90 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
37ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
37cb0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
37cc0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
37cd0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
37ce0 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
37cf0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e  age */.  u8 *pIn
37d00 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  s;         /* Th
37d10 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65  e point in pPage
37d20 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65  ->aCellIdx[] whe
37d30 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72  re no cell inser
37d40 74 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ted */..  assert
37d50 28 20 2a 70 52 43 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRC==SQLITE_O
37d60 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
37d70 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
37d80 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
37d90 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
37da0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ert( MX_CELL(pPa
37db0 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
37dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37dd0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
37de0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c  LL(pPage->pBt) |
37df0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
37e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
37e10 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
37e20 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
37e30 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
37e40 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ( ArraySize(pPag
37e50 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61  e->apOvfl)==Arra
37e60 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f  ySize(pPage->aiO
37e70 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
37e80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
37e90 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
37ea0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
37eb0 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
37ec0 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
37ed0 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
37ee0 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
37ef0 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
37f00 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
37f10 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
37f20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
37f30 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
37f40 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
37f50 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
37f60 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
37f70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
37f80 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
37f90 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
37fa0 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
37fb0 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
37fc0 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
37fd0 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
37fe0 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
37ff0 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
38000 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
38010 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
38020 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a  =pPage->xCellSiz
38030 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  e(pPage, pCell) 
38040 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68  || (sz==8 && iCh
38050 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20  ild>0) );.  if( 
38060 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
38070 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
38080 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
38090 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
380a0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43  memcpy(pTemp, pC
380b0 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  ell, sz);.      
380c0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
380d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
380e0 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
380f0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
38100 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
38110 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
38120 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 2f 2a 20 43  flow++;.    /* C
38130 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
38140 74 20 41 72 72 61 79 53 69 7a 65 2d 31 20 73 69  t ArraySize-1 si
38150 6e 63 65 20 77 65 20 68 6f 6c 64 20 62 61 63 6b  nce we hold back
38160 20 6f 6e 65 20 65 78 74 72 61 20 73 6c 6f 74 0a   one extra slot.
38170 20 20 20 20 2a 2a 20 61 73 20 61 20 63 6f 6e 74      ** as a cont
38180 69 6e 67 65 6e 63 79 2e 20 20 49 6e 20 6f 74 68  ingency.  In oth
38190 65 72 20 77 6f 72 64 73 2c 20 6e 65 76 65 72 20  er words, never 
381a0 6e 65 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 33  need more than 3
381b0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a   overflow.    **
381c0 20 73 6c 6f 74 73 20 62 75 74 20 34 20 61 72 65   slots but 4 are
381d0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 6a 75 73 74   allocated, just
381e0 20 74 6f 20 62 65 20 73 61 66 65 2e 20 2a 2f 0a   to be safe. */.
381f0 20 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20      assert( j < 
38200 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
38210 3e 61 70 4f 76 66 6c 29 2d 31 20 29 3b 0a 20 20  >apOvfl)-1 );.  
38220 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b    pPage->apOvfl[
38230 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  j] = pCell;.    
38240 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d  pPage->aiOvfl[j]
38250 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20   = (u16)i;..    
38260 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  /* When multiple
38270 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72   overflows occur
38280 2c 20 74 68 65 79 20 61 72 65 20 61 6c 77 61 79  , they are alway
38290 73 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64  s sequential and
382a0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65   in.    ** sorte
382b0 64 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69  d order.  This i
382c0 6e 76 61 72 69 61 6e 74 73 20 61 72 69 73 65 20  nvariants arise 
382d0 62 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65  because multiple
382e0 20 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20   overflows can. 
382f0 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72     ** only occur
38300 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
38310 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
38320 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
38330 67 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a  ge during.    **
38340 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20   balancing, and 
38350 74 68 65 20 64 69 76 69 64 65 72 73 20 61 72 65  the dividers are
38360 20 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f   adjacent and so
38370 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
38380 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c   assert( j==0 ||
38390 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
383a0 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a  -1]<(u16)i ); /*
383b0 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f   Overflows in so
383c0 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
383d0 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c    assert( j==0 |
383e0 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76  | i==pPage->aiOv
383f0 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f  fl[j-1]+1 );   /
38400 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20  * Overflows are 
38410 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20  sequential */.  
38420 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
38430 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
38440 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
38450 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
38460 63 21 3