/ Hex Artifact Content
Login

Artifact bf2e05e26c26df4acc67ef09a7d43052b4a3759f81f77619bc2a9339c6a14c4c:


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: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
5c60: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
5c70: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
5c80: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c90: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5cb0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5cd0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5d00: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5d10: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5d20: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d40: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d50: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d60: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d70: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d80: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d90: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5da0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5db0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5dc0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5dd0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5de0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5df0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5e00: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5e10: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5e20: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e30: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e60: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e70: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e80: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e90: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5ea0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f00: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5f10: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5f20: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f40: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f50: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f70: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f80: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5fb0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5fc0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fd0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5ff0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6000: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6010: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6020: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6030: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6040: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6050: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6060: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6070: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6080: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6090: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
60a0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
60b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
60c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60d0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60e0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60f0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6100: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6110: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6120: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6130: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6140: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6150: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6160: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6170: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6180: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6190: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
61a0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
61b0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
61c0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61f0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
6200: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
6210: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
6220: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6230: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6240: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6250: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6260: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6270: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6280: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6290: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
62b0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
62c0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62d0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62e0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62f0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
6300: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
6310: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
6320: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6330: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6340: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6350: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6360: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6370: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6380: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6390: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
63a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
63b0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
63c0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63d0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63e0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63f0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
6400: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
6410: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6420: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6430: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6450: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6460: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6470: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6480: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6490: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
64a0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
64b0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
64c0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64d0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64e0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
6500: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
6510: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
6520: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6530: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6540: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6560: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6580: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6590: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
65a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
65b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
65c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65d0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65e0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65f0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
6600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
6610: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
6620: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6630: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6640: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6650: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6660: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6670: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6690: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
66a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
66b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
66c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6700: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
6710: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
6720: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6730: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6740: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6750: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6760: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6770: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6780: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6790: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
67a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
67b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
67c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6800: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
6810: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
6820: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6830: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6840: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6850: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6860: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6870: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6880: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6890: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
68a0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
68b0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
68c0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68d0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6900: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6910: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
6920: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6940: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6950: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6960: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6970: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
69a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
69b0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
69c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6a00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6a10: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a40: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a50: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a60: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a70: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a90: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6aa0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ac0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6ad0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6af0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6b10: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6b20: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b30: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b40: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b60: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b70: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b80: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b90: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6ba0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6bb0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6bc0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6bd0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bf0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6c00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6c10: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c30: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c40: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c50: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c80: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c90: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6ca0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6cb0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6cd0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6ce0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cf0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6d00: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6d20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d50: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d60: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d70: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d80: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d90: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
6da0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6db0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
6dc0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6dd0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6de0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6e00: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6e10: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6e20: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6e40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6e50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6e60: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
6e70: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
6e80: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
6e90: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
6ea0: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
6eb0: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
6ec0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ef0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6f00: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6f20: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6f30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f40: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
6f50: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
6f60: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
6f70: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
6f80: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
6f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fa0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6fb0: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6fe0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ff0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
7000: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
7010: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
7020: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
7030: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
7040: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
7050: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
7060: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
7070: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
7080: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
7090: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
70a0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
70b0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
70c0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
70d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
70e0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
70f0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
7100: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
7110: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7120: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7130: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7150: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
7160: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
7170: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
7180: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
7190: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
71a0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
71b0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
71c0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
71d0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
71e0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
71f0: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
7200: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
7210: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
7220: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
7230: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
7240: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
7250: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
7260: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7270: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7280: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
7290: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
72a0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
72b0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
72c0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
72d0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
72e0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
72f0: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
7300: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
7310: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
7320: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
7330: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
7340: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
7350: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
7360: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
7370: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
7380: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7390: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
73a0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
73b0: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
73c0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
73d0: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
73e0: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
73f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7400: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
7410: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
7420: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
7430: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
7440: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
7450: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
7460: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
7470: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
7480: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
7490: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
74a0: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
74b0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
74c0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
74d0: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
74e0: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
74f0: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
7500: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
7510: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
7520: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
7530: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
7540: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
7550: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
7560: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
7570: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
7580: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
7590: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
75a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
75b0: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
75c0: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
75d0: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
75e0: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
75f0: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
7600: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7610: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
7620: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7630: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
7640: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
7650: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
7660: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
7670: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
7680: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
7690: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
76a0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
76b0: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
76c0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
76d0: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
76e0: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
76f0: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
7700: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
7710: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
7720: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7730: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
7740: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
7750: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
7760: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
7770: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7780: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
7790: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
77a0: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
77b0: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
77c0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
77d0: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
77e0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
77f0: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
7800: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
7810: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
7820: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
7830: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
7840: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
7850: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
7860: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
7870: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
7880: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
7890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
78a0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
78b0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
78c0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
78d0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
78e0: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
78f0: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
7900: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
7910: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
7920: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
7930: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
7940: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
7950: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
7960: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
7970: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
7980: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
7990: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
79a0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
79b0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
79c0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
79d0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
79e0: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
79f0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7a00: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7a10: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7a20: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7a30: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7a40: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
7a50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7a60: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
7a70: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
7a80: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
7a90: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
7aa0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7ab0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7ac0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7ad0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7ae0: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7af0: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7b00: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7b10: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7b20: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7b30: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7b40: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7b50: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
7b60: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7b70: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
7b80: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7b90: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
7ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7bb0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7bc0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7bd0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7be0: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7bf0: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
7c00: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7c20: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7c30: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7c40: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7c50: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c60: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c70: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c80: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c90: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7ca0: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7cb0: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7cc0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7cd0: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7ce0: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7cf0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7d00: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7d10: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7d20: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7d30: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7d40: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7d50: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d60: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d70: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d80: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d90: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7da0: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7db0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7dc0: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7dd0: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7de0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7df0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7e00: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7e10: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7e20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7e30: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7e40: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7e50: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e60: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e70: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e90: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7ea0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7eb0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7ec0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7ed0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7ee0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7ef0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7f00: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7f10: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7f20: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7f30: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7f40: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7f50: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f60: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f70: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f80: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f90: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7fa0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7fb0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7fc0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7fd0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7fe0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7ff0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
8000: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
8010: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
8020: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
8030: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
8040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8050: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8060: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8070: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8080: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8090: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
80a0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
80b0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
80c0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
80d0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
80e0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
80f0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
8100: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
8110: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8120: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
8130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
8140: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
8150: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8160: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8180: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
81a0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
81b0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
81c0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
81d0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
81e0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
81f0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
8200: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
8210: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
8220: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
8230: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8240: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
8250: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8260: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8270: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8280: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8290: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
82a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
82b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
82c0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
82d0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
82e0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
82f0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8300: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8310: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
8320: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
8330: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8340: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
8350: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8360: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8370: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8380: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8390: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
83a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
83b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
83c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
83d0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
83e0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
83f0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8400: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
8410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8430: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
8440: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
8450: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8460: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8480: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8490: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
84a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
84b0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
84c0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
84d0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
84e0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
84f0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
8500: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
8510: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
8520: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8530: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8540: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8550: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8560: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8570: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8590: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
85a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
85b0: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
85c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
85d0: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
85e0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
85f0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
8600: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
8610: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
8620: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
8630: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
8640: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
8650: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8660: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8670: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8680: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8690: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
86a0: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
86b0: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
86c0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
86d0: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
86e0: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
86f0: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
8700: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
8710: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8720: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
8730: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8740: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8750: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8760: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8770: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8780: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8790: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
87a0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
87b0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
87c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
87d0: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
87e0: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
87f0: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
8800: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
8810: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
8820: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
8830: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
8840: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
8850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8860: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8870: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8880: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8890: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
88a0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
88b0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
88c0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
88d0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
88e0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
88f0: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
8900: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8910: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8920: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
8930: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8940: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
8950: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8960: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8970: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8980: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8990: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
89a0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
89b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
89c0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
89d0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
89e0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
89f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
8a00: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
8a10: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
8a20: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
8a30: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
8a40: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
8a50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a60: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a70: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a80: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a90: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8aa0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8ab0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8ac0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8ad0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8af0: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8b00: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8b10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8b20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8b30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8b40: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8b50: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b60: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b70: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b80: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b90: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8bc0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8bd0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8be0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8bf0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8c00: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8c10: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8c20: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8c30: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8c40: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c80: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c90: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8ca0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8cb0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8cc0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8cd0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8ce0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8cf0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8d00: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8d10: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8d20: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8d30: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8d40: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8d50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d60: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d80: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d90: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8da0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8db0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8dc0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8dd0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8de0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8df0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8e00: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8e10: 74 72 28 78 2c 20 79 2c 20 7a 2c 20 72 63 29 0a  tr(x, y, z, rc).
8e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8e30: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8e40: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8e50: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8e60: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8e70: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8e80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8e90: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8ea0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8eb0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8ec0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8ed0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8ee0: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8ef0: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8f00: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8f10: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8f20: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8f30: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8f40: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8f50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8f60: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8f70: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8f80: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8f90: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8fa0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8fb0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8fc0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8fd0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8fe0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8ff0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
9000: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
9010: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
9020: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
9030: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
9040: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
9050: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
9060: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
9070: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
9080: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
9090: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
90a0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
90b0: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
90c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
90d0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
90e0: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
90f0: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
9100: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
9110: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
9120: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
9130: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
9140: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
9150: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
9160: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
9170: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9180: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9190: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
91a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
91b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
91c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
91d0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9200: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9210: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9230: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9240: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
9250: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9260: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
9270: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
9280: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
9290: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
92a0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
92b0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
92c0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
92d0: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
92e0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
92f0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
9300: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
9310: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
9320: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
9330: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
9340: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
9350: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9360: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9370: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9380: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9390: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
93a0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
93b0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
93c0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
93d0: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
93e0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
93f0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9400: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
9410: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
9420: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
9430: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
9440: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
9450: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9460: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9470: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9480: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9490: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
94a0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
94b0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
94c0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
94d0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
94e0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
94f0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
9500: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
9510: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
9520: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
9530: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9540: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9550: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9560: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9570: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9580: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9590: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
95a0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
95b0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
95c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
95d0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
95e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
95f0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9600: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
9610: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
9620: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
9630: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
9640: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
9650: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9660: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9670: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9680: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9690: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
96a0: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
96b0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
96c0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
96d0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
96e0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
96f0: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
9700: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
9710: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
9720: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
9730: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9740: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
9750: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9760: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9770: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9780: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9790: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
97a0: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
97b0: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
97c0: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
97d0: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
97e0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
97f0: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
9800: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
9810: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
9820: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
9830: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
9840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
9850: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9860: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9870: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9880: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9890: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
98a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98d0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98e0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9900: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9910: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
9920: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9930: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9940: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9950: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9960: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9970: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9980: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9990: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
99a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
99b0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
99c0: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
99d0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
99e0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
99f0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9a00: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9a10: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
9a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
9a30: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9a40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
9a50: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9a60: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9a70: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9aa0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9ab0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9ac0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9ad0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9ae0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9af0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9b00: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9b10: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9b20: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9b30: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9b40: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9b50: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9b60: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9b70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9b80: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9b90: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9ba0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9bb0: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9bc0: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9bd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9be0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9bf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9c00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9c10: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9c20: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9c30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9c40: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9c50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9c60: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9c70: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9c80: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9c90: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9ca0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9cb0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9cc0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9cd0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9ce0: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9cf0: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9d00: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9d10: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9d20: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9d30: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9d40: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9d50: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9d60: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9d70: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9d80: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9d90: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9da0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9db0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9dc0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9dd0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9de0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9df0: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9e00: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9e10: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9e20: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9e30: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9e40: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9e50: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9e60: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9e70: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9e80: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9e90: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9ea0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9eb0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9ec0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ed0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9ee0: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9ef0: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9f00: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9f10: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9f20: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9f30: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9f40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9f50: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9f70: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9f80: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9f90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9fb0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9fc0: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9fd0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9fe0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9ff0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a000: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a010: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a020: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a030: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a040: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a050: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a060: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a070: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a080: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a090: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a0a0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a0b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a0c0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a0d0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a0e0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a0f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a100: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a110: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a120: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a130: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a140: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a150: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a160: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a170: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a180: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a190: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a1a0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a1b0: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a1c0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a1d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a1e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
a1f0: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
a200: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a210: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a220: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a230: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
a240: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a250: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
a260: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
a270: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a280: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a290: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a2a0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2c0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
a2d0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
a2e0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a300: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
a310: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a340: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a360: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a370: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a380: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a390: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a3a0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a3b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a3c0: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a3d0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a3e0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a3f0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a400: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a410: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a420: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a430: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a440: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a450: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a460: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a470: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a480: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a490: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a4a0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a4b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a4c0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a4d0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a4e0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a4f0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a500: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a510: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a520: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a530: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a540: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a550: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a560: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a570: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a580: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a590: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a5a0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a5b0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a5c0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a5d0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a5e0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a5f0: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a600: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a610: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a620: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a630: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a640: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a650: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a660: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a670: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a680: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a690: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a6a0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a6b0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a6c0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a6d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a6e0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a6f0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a700: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a710: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a720: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a730: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a740: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a750: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a760: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a770: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a780: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a790: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a7a0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a7b0: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a7d0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a7e0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a7f0: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a800: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a810: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a820: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a830: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a840: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a850: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a860: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a870: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a880: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a890: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a8a0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a8b0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a8c0: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a8d0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a8e0: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a8f0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a900: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a910: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a920: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a930: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a940: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a950: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a960: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a970: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a980: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a990: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a9a0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a9b0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a9c0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a9d0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a9e0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a9f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
aa00: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
aa10: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa40: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
aa50: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
aa60: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
aa90: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
aaa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aab0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
aac0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
aad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
aae0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
aaf0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
ab00: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
ab10: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
ab20: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
ab30: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
ab40: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
ab50: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
ab60: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
ab70: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
ab80: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
ab90: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
aba0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
abb0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
abc0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
abd0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
abe0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
abf0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
ac00: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
ac10: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
ac20: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
ac30: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
ac40: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
ac50: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
ac60: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
ac70: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
ac80: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
ac90: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
aca0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
acb0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
acc0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
acd0: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
ace0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
acf0: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
ad00: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
ad10: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
ad20: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
ad30: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
ad40: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
ad50: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
ad60: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ad70: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
ad80: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
ad90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
ada0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
adb0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
adc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
add0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
ade0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
adf0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
ae00: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
ae10: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
ae20: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ae30: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
ae40: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ae60: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ae70: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ae80: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ae90: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
aea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
aeb0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
aec0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
aed0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
aee0: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
aef0: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
af00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
af10: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
af20: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
af30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
af40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af50: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af60: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
af70: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
af80: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
af90: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
afa0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
afb0: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
afc0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
afd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
afe0: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
aff0: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
b000: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
b010: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
b020: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b030: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
b040: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
b050: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b060: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
b070: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b080: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b090: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b0b0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b0c0: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
b0d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b0e0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
b0f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b100: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b110: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
b120: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
b130: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
b140: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
b150: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
b160: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
b170: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
b180: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
b190: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
b1a0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
b1b0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
b1c0: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
b1d0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
b1e0: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
b1f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
b200: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
b210: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b220: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
b230: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
b240: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b250: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
b260: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b270: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
b280: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
b290: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
b2a0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
b2b0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b2c0: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
b2d0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
b2e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
b2f0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
b300: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
b310: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b320: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
b330: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
b340: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
b350: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b360: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b370: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b380: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b390: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b3a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b3b0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b3c0: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b3d0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b3e0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b3f0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b410: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ./*.** The cell 
b430: 70 43 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74  pCell is current
b440: 6c 79 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  ly part of page 
b450: 70 53 72 63 20 62 75 74 20 77 69 6c 6c 20 75 6c  pSrc but will ul
b460: 74 69 6d 61 74 65 6c 79 20 62 65 20 70 61 72 74  timately be part
b470: 0a 2a 2a 20 6f 66 20 70 50 61 67 65 2e 20 20 28  .** of pPage.  (
b480: 70 53 72 63 20 61 6e 64 20 70 50 61 67 65 72 20  pSrc and pPager 
b490: 61 72 65 20 6f 66 74 65 6e 20 74 68 65 20 73 61  are often the sa
b4a0: 6d 65 2e 29 20 20 49 66 20 70 43 65 6c 6c 20 63  me.)  If pCell c
b4b0: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 70 6f 69  ontains a.** poi
b4c0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
b4d0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
b4e0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
b4f0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
b500: 6f 72 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  or.** the overfl
b510: 6f 77 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ow page that wil
b520: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72  l be valid after
b530: 20 70 43 65 6c 6c 20 68 61 73 20 62 65 65 6e 20   pCell has been 
b540: 6d 6f 76 65 64 20 74 6f 20 70 50 61 67 65 2e 0a  moved to pPage..
b550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b560: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
b570: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b580: 4d 65 6d 50 61 67 65 20 2a 70 53 72 63 2c 20 75  MemPage *pSrc, u
b590: 38 20 2a 70 43 65 6c 6c 2c 69 6e 74 20 2a 70 52  8 *pCell,int *pR
b5a0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
b5b0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
b5c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b5d0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
b5e0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b5f0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b600: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
b610: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
b620: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
b630: 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20 20 20   Pgno ovfl;.    
b640: 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
b650: 4e 28 70 53 72 63 2d 3e 61 44 61 74 61 45 6e 64  N(pSrc->aDataEnd
b660: 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69  , pCell, pCell+i
b670: 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
b680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b690: 53 72 63 21 3d 70 50 61 67 65 20 29 3b 0a 20 20  Src!=pPage );.  
b6a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
b6b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b6c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b6d0: 20 20 7d 0a 20 20 20 20 6f 76 66 6c 20 3d 20 67    }.    ovfl = g
b6e0: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
b6f0: 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20  nfo.nSize-4]);. 
b700: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
b710: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
b720: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
b730: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
b740: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
b750: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
b760: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
b770: 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  en. This routine
b780: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c   reorganizes cel
b790: 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ls within the.**
b7a0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
b7b0: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d  ere are no free-
b7c0: 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72  blocks on the fr
b7d0: 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a  ee-block list..*
b7e0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
b7f0: 4d 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d  MaxFrag is the m
b800: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
b810: 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63   fragmented spac
b820: 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
b830: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b840: 70 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20  page after this 
b850: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
b860: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
b870: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
b880: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
b890: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
b8a0: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
b8b0: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
b8c0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b8d0: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
b8e0: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
b8f0: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
b900: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
b910: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
b920: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
b930: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
b940: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
b950: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
b960: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
b970: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
b980: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
b990: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d  e *pPage, int nM
b9a0: 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69  axFrag){.  int i
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b9c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b9d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
b9e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b9f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
ba00: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
ba10: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
ba40: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
ba50: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba70: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
ba80: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
ba90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
baa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
bab0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
bac0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
bad0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
bae0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
baf0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bb00: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
bb10: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
bb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bb30: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
bb40: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
bb50: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bb70: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
bb80: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bb90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bba0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
bbb0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
bbc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bbd0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
bbe0: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
bbf0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
bc00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
bc10: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
bc20: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
bc30: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
bc40: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
bc50: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bc60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
bc70: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc90: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bca0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61  ll index */..  a
bcb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bcc0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bcd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bcf0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
bd00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
bd10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
bd20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
bd30: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
bd40: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
bd50: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
bd60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bd70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bd80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
bd90: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
bda0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bdb0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
bdc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bdd0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
bde0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bdf0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
be00: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
be10: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
be20: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
be30: 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
be40: 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  );.  iCellFirst 
be50: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
be60: 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65  *nCell;.  usable
be70: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
be80: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
be90: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
bea0: 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69  handles pages wi
beb0: 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  th two or fewer 
bec0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20  free blocks and 
bed0: 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72  nMaxFrag.  ** or
bee0: 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65   fewer fragmente
bef0: 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73  d bytes. In this
bf00: 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74   case it is fast
bf10: 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20  er to move the. 
bf20: 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29   ** two (or one)
bf30: 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73   blocks of cells
bf40: 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29   using memmove()
bf50: 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71   and add the req
bf60: 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65  uired.  ** offse
bf70: 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74  ts to each point
bf80: 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  er in the cell-p
bf90: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61  ointer array tha
bfa0: 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a  n it is to .  **
bfb0: 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65   reconstruct the
bfc0: 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a   entire page.  *
bfd0: 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74  /.  if( (int)dat
bfe0: 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72  a[hdr+7]<=nMaxFr
bff0: 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  ag ){.    int iF
c000: 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ree = get2byte(&
c010: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 0a 20  data[hdr+1]);.. 
c020: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69     /* If the ini
c030: 74 69 61 6c 20 66 72 65 65 62 6c 6f 63 6b 20 6f  tial freeblock o
c040: 66 66 73 65 74 20 77 65 72 65 20 6f 75 74 20 6f  ffset were out o
c050: 66 20 62 6f 75 6e 64 73 2c 20 74 68 61 74 20 77  f bounds, that w
c060: 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 2a 2a  ould have.    **
c070: 20 62 65 65 6e 20 64 65 74 65 63 74 65 64 20 62   been detected b
c080: 79 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72  y btreeComputeFr
c090: 65 65 53 70 61 63 65 28 29 20 77 68 65 6e 20 69  eeSpace() when i
c0a0: 74 20 77 61 73 20 63 6f 6d 70 75 74 69 6e 67 20  t was computing 
c0b0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
c0c0: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
c0d0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  on the page. */.
c0e0: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
c0f0: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  e<=usableSize-4 
c100: 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  );.    if( iFree
c110: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46   ){.      int iF
c120: 72 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28  ree2 = get2byte(
c130: 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 20  &data[iFree]);. 
c140: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 3e       if( iFree2>
c150: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72  usableSize-4 ) r
c160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c170: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c180: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69  ;.      if( 0==i
c190: 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69  Free2 || (data[i
c1a0: 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74  Free2]==0 && dat
c1b0: 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20  a[iFree2+1]==0) 
c1c0: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ){.        u8 *p
c1d0: 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  End = &data[cell
c1e0: 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
c1f0: 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ];.        u8 *p
c200: 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Addr;.        in
c210: 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20  t sz2 = 0;.     
c220: 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32     int sz = get2
c230: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c240: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  +2]);.        in
c250: 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65  t top = get2byte
c260: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c270: 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 70 3e          if( top>
c280: 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  =iFree ){.      
c290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2a0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
c2b0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
c2c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
c2d0: 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ee2 ){.         
c2e0: 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46   if( iFree+sz>iF
c2f0: 72 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51  ree2 ) return SQ
c300: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c310: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c320: 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79      sz2 = get2by
c330: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
c340: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2]);.          i
c350: 66 28 20 69 46 72 65 65 32 2b 73 7a 32 20 3e 20  f( iFree2+sz2 > 
c360: 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74  usableSize ) ret
c370: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c380: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
c390: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
c3a0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  e(&data[iFree+sz
c3b0: 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72  +sz2], &data[iFr
c3c0: 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28  ee+sz], iFree2-(
c3d0: 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20  iFree+sz));.    
c3e0: 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b        sz += sz2;
c3f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
c400: 66 28 20 69 46 72 65 65 2b 73 7a 3e 75 73 61 62  f( iFree+sz>usab
c410: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
c420: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c430: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
c440: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
c450: 0a 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d  ..        cbrk =
c460: 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20   top+sz;.       
c470: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69   assert( cbrk+(i
c480: 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61  Free-top) <= usa
c490: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
c4a0: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
c4b0: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f  [cbrk], &data[to
c4c0: 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a  p], iFree-top);.
c4d0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64          for(pAdd
c4e0: 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  r=&data[cellOffs
c4f0: 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b  et]; pAddr<pEnd;
c500: 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20   pAddr+=2){.    
c510: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
c520: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
c530: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72        if( pc<iFr
c540: 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  ee ){ put2byte(p
c550: 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a  Addr, pc+sz); }.
c560: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
c570: 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20  f( pc<iFree2 ){ 
c580: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
c590: 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20  pc+sz2); }.     
c5a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
c5b0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  o defragment_out
c5c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c5d0: 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73    }..  cbrk = us
c5e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
c5f0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
c600: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
c610: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
c620: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
c630: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
c640: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
c650: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
c660: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
c670: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
c680: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
c690: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c6a0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
c6b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c6c0: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
c6d0: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
c6e0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
c6f0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
c700: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
c710: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
c720: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
c730: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
c740: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
c750: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c760: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c780: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c790: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
c7a0: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
c7b0: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
c7c0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
c7d0: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
c7e0: 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b  ize(pPage, &src[
c7f0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
c800: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  = size;.    if( 
c810: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
c820: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c830: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
c840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c850: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
c870: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
c880: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
c890: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
c8a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
c8b0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
c8c0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
c8d0: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
c8e0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c8f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c900: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
c910: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
c920: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
c930: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
c940: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
c950: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
c960: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
c970: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
c980: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
c990: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
c9a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
c9b0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
c9c0: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
c9d0: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
c9e0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
c9f0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
ca00: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
ca10: 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  ze);.  }.  data[
ca20: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65  hdr+7] = 0;.. de
ca30: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20  fragment_out:.  
ca40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
ca50: 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Free>=0 );.  if(
ca60: 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72   data[hdr+7]+cbr
ca70: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
ca80: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
ca90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
caa0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
cab0: 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
cac0: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
cad0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
cae0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
caf0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
cb00: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
cb10: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+2] = 0;.  m
cb20: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
cb30: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
cb40: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
cb50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
cb60: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
cb70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
cb80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
cb90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
cba0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d  Search the free-
cbb0: 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67  list on page pPg
cbc0: 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74   for space to st
cbd0: 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65  ore a cell nByte
cbe0: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a   bytes in.** siz
cbf0: 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65  e. If one can be
cc00: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61   found, return a
cc10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cc20: 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65  space and remove
cc30: 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   it.** from the 
cc40: 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
cc50: 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
cc60: 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75  space can be fou
cc70: 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  nd on the free-l
cc80: 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ist, return NULL
cc90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
cca0: 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74  ction may detect
ccb0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68   corruption with
ccc0: 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72  in pPg.  If corr
ccd0: 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74  uption is.** det
cce0: 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20  ected then *pRc 
ccf0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
cd00: 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c  _CORRUPT and NUL
cd10: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
cd20: 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68  *.** Slots on th
cd30: 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74  e free list that
cd40: 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61   are between 1 a
cd50: 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65  nd 3 bytes large
cd60: 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20  r than nByte.** 
cd70: 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20  will be ignored 
cd80: 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78  if adding the ex
cd90: 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65  tra space to the
cda0: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
cdb0: 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74  ount.** causes t
cdc0: 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  he fragmentation
cdd0: 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64   count to exceed
cde0: 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75   60..*/.static u
cdf0: 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  8 *pageFindSlot(
ce00: 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  MemPage *pPg, in
ce10: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52  t nByte, int *pR
ce20: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  c){.  const int 
ce30: 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66  hdr = pPg->hdrOf
ce40: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
ce50: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61   /* Offset to pa
ce60: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ge header */.  u
ce70: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
ce80: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20  = pPg->aData;   
ce90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
cea0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
ceb0: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
cee0: 73 20 6f 66 20 70 74 72 20 74 6f 20 70 63 20 2a  s of ptr to pc *
cef0: 2f 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74  /.  int pc = get
cf00: 32 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64  2byte(&aData[iAd
cf10: 64 72 5d 29 3b 20 20 20 20 20 20 20 20 20 20 2f  dr]);          /
cf20: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
cf30: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e  ree slot */.  in
cf40: 74 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  t x;            
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 65           /* Exce
cf70: 73 73 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  ss size of the s
cf80: 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lot */.  int max
cf90: 50 43 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  PC = pPg->pBt->u
cfa0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 6e 42 79 74  sableSize - nByt
cfb0: 65 3b 20 20 2f 2a 20 4d 61 78 20 61 64 64 72 65  e;  /* Max addre
cfc0: 73 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20  ss for a usable 
cfd0: 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 73 69  slot */.  int si
cfe0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
d010: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
d020: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30  ..  assert( pc>0
d030: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c   );.  while( pc<
d040: 3d 6d 61 78 50 43 20 29 7b 0a 20 20 20 20 2f 2a  =maxPC ){.    /*
d050: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d060: 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20  22710-53328 The 
d070: 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68  third and fourth
d080: 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20   bytes of each. 
d090: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20     ** freeblock 
d0a0: 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61  form a big-endia
d0b0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
d0c0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
d0d0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20  he freeblock.   
d0e0: 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e   ** in bytes, in
d0f0: 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79  cluding the 4-by
d100: 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  te header. */.  
d110: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
d120: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b  e(&aData[pc+2]);
d130: 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69  .    if( (x = si
d140: 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29  ze - nByte)>=0 )
d150: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
d160: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
d170: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
d180: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 34 20  ;.      if( x<4 
d190: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
d1a0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34  IDENCE-OF: R-114
d1b0: 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65  98-58022 In a we
d1c0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
d1d0: 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c   page, the total
d1e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
d1f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66  er of bytes in f
d200: 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74  ragments may not
d210: 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20   exceed 60. */. 
d220: 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61         if( aData
d230: 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74  [hdr+7]>57 ) ret
d240: 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  urn 0;..        
d250: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
d260: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
d270: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
d280: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
d290: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
d2a0: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
d2b0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
d2c0: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
d2d0: 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61  a[iAddr], &aData
d2e0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
d2f0: 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b    aData[hdr+7] +
d300: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d  = (u8)x;.      }
d310: 65 6c 73 65 20 69 66 28 20 78 2b 70 63 20 3e 20  else if( x+pc > 
d320: 6d 61 78 50 43 20 29 7b 0a 20 20 20 20 20 20 20  maxPC ){.       
d330: 20 2f 2a 20 54 68 69 73 20 73 6c 6f 74 20 65 78   /* This slot ex
d340: 74 65 6e 64 73 20 6f 66 66 20 74 68 65 20 65 6e  tends off the en
d350: 64 20 6f 66 20 74 68 65 20 75 73 61 62 6c 65 20  d of the usable 
d360: 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  part of the page
d370: 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 52 63   */.        *pRc
d380: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
d390: 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20  T_PAGE(pPg);.   
d3a0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d3b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d3c0: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
d3d0: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
d3e0: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
d3f0: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
d400: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  ount.        ** 
d410: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
d420: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
d430: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
d440: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
d450: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
d460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d470: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
d480: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
d490: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
d4a0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
d4b0: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  aData[pc]);.    
d4c0: 69 66 28 20 70 63 3c 3d 69 41 64 64 72 2b 73 69  if( pc<=iAddr+si
d4d0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
d4e0: 70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pc ){.        /*
d4f0: 20 54 68 65 20 6e 65 78 74 20 73 6c 6f 74 20 69   The next slot i
d500: 6e 20 74 68 65 20 63 68 61 69 6e 20 69 73 20 6e  n the chain is n
d510: 6f 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ot past the end 
d520: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
d530: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a  lot */.        *
d540: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
d550: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
d560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
d570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
d580: 7d 0a 20 20 69 66 28 20 70 63 3e 6d 61 78 50 43  }.  if( pc>maxPC
d590: 2b 6e 42 79 74 65 2d 34 20 29 7b 0a 20 20 20 20  +nByte-4 ){.    
d5a0: 2f 2a 20 54 68 65 20 66 72 65 65 20 73 6c 6f 74  /* The free slot
d5b0: 20 63 68 61 69 6e 20 65 78 74 65 6e 64 73 20 6f   chain extends o
d5c0: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
d5d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 2a 70  e page */.    *p
d5e0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
d5f0: 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20  UPT_PAGE(pPg);. 
d600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
d610: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
d620: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
d630: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
d640: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
d650: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
d660: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
d670: 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  t. Write into *p
d680: 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Idx the index in
d690: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
d6a0: 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73  ].** of the firs
d6b0: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
d6c0: 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72  ted space. Retur
d6d0: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
d6e0: 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f  OK or.** an erro
d6f0: 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20  r code (usually 
d700: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
d710: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
d720: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
d730: 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69  t there is suffi
d740: 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d  cient space to m
d750: 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63  ake the.** alloc
d760: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
d770: 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20  tine might need 
d780: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e  to defragment in
d790: 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a   order to bring.
d7a0: 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65  ** all the space
d7b0: 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76   together, howev
d7c0: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
d7d0: 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69  e will avoid usi
d7e0: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ng.** the first 
d7f0: 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74  two bytes past t
d800: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
d810: 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75  area since presu
d820: 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c  mably this.** al
d830: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  location is bein
d840: 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20  g made in order 
d850: 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  to insert a new 
d860: 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c  cell, so we will
d870: 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20  .** also end up 
d880: 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65  needing a new ce
d890: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
d8a0: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
d8b0: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
d8c0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
d8d0: 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20  e, int *pIdx){. 
d8e0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
d8f0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d900: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
d910: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
d920: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
d930: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
d940: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
d950: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d960: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
d970: 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  a */.  int top; 
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d9a0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
d9b0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d9c0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d9d0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
d9f0: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
da00: 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20  */.  int gap;   
da10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
da20: 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65  te of gap betwee
da30: 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  n cell pointers 
da40: 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  and cell content
da50: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
da60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
da70: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
da80: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
da90: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
daa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
dab0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
dac0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
dad0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
dae0: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
daf0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
db00: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
db10: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
db20: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
db30: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
db40: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
db50: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28  ssert( nByte < (
db60: 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d  int)(pPage->pBt-
db70: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29  >usableSize-8) )
db80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
db90: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
dba0: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
dbb0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
dbc0: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
dbd0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
dbe0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
dbf0: 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29  rt( gap<=65536 )
dc00: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
dc10: 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39  OF: R-29356-0239
dc20: 31 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  1 If the databas
dc30: 65 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62  e uses a 65536-b
dc40: 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20  yte page size.  
dc50: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72  ** and the reser
dc60: 76 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72  ved space is zer
dc70: 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c  o (the usual val
dc80: 75 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20  ue for reserved 
dc90: 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e  space).  ** then
dca0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
dcb0: 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65  t offset of an e
dcc0: 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20  mpty page wants 
dcd0: 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a  to be 65536..  *
dce0: 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
dcf0: 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c  integer is too l
dd00: 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65  arge to be store
dd10: 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e  d in a 2-byte un
dd20: 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65  signed.  ** inte
dd30: 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20  ger, so a value 
dd40: 6f 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20  of 0 is used in 
dd50: 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20  its place. */.  
dd60: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
dd70: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
dd80: 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e  assert( top<=(in
dd90: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
dda0: 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50  ableSize ); /* P
ddb0: 72 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64  revent by getAnd
ddc0: 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20  InitPage() */.  
ddd0: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
dde0: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26     if( top==0 &&
ddf0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
de00: 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29  bleSize==65536 )
de10: 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35  {.      top = 65
de20: 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  536;.    }else{.
de30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
de40: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
de50: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
de60: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
de70: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
de80: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
de90: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
dea0: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2c  re cell pointer,
deb0: 0a 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65  .  ** and if the
dec0: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
ded0: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
dee0: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
def0: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
df00: 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  r a slot big eno
df10: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
df20: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
df30: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
df40: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
df50: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
df60: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
df70: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
df80: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
df90: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
dfa0: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
dfb0: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
dfc0: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
dfd0: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
dfe0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
dff0: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
e000: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
e010: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
e020: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
e030: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
e040: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
e050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e060: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
e070: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
e080: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e090: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
e0a0: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
e0b0: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
e0c0: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
e0d0: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
e0e0: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
e0f0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
e100: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
e110: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
e120: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
e130: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
e140: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
e150: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
e160: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
e170: 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
e180: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30   pPage->nFree>=0
e190: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   );.    rc = def
e1a0: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
e1b0: 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d  e, MIN(4, pPage-
e1c0: 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74  >nFree - (2+nByt
e1d0: 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  e)));.    if( rc
e1e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e1f0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
e200: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
e210: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
e220: 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d  t( gap+2+nByte<=
e230: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
e240: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
e250: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
e260: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
e270: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
e280: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
e290: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
e2a0: 20 20 54 68 65 20 62 74 72 65 65 43 6f 6d 70 75    The btreeCompu
e2b0: 74 65 46 72 65 65 53 70 61 63 65 28 29 20 63 61  teFreeSpace() ca
e2c0: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
e2d0: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
e2e0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
e2f0: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
e300: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
e310: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
e320: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
e330: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
e340: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
e350: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
e360: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
e370: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
e380: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
e390: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
e3a0: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
e3b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
e3c0: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
e3d0: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
e3e0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
e3f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
e400: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
e410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e430: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
e440: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
e450: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
e460: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
e470: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
e480: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
e490: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
e4a0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
e4b0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
e4c0: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
e4d0: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
e4e0: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
e4f0: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 6e  sced..**.** Even
e500: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
e510: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
e520: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 43  hecked by btreeC
e530: 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63 65 28  omputeFreeSpace(
e540: 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69  ),.** that routi
e550: 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65  ne will not dete
e560: 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65  ct overlap betwe
e570: 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  en cells or free
e580: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20  blocks.  Nor.** 
e590: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63  does it detect c
e5a0: 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63  ells or freebloc
e5b0: 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68  ks that encrouch
e5c0: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76   into the reserv
e5d0: 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74  ed bytes.** at t
e5e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
e5f0: 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74  ge.  So do addit
e600: 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  ional corruption
e610: 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74   checks inside t
e620: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61  his.** routine a
e630: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
e640: 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20  _CORRUPT if any 
e650: 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75  problems are fou
e660: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
e670: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
e680: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20  age *pPage, u16 
e690: 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a  iStart, u16 iSiz
e6a0: 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20  e){.  u16 iPtr; 
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e6d0: 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f  ddress of ptr to
e6e0: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
e6f0: 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c  */.  u16 iFreeBl
e700: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
e710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
e720: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
e730: 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20  t freeblock */. 
e740: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68         /* Page h
e770: 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f  eader size.  0 o
e780: 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46  r 100 */.  u8 nF
e790: 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rag = 0;        
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e   /* Reduction in
e7c0: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a   fragmentation *
e7d0: 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a  /.  u16 iOrigSiz
e7e0: 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20  e = iSize;      
e7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
e800: 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69  ginal value of i
e810: 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b  Size */.  u16 x;
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
e850: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
e860: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
e870: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
e880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
e890: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
e8a0: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
e8b0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
e8c0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
e8d0: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
e8e0: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
e8f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e900: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
e910: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
e920: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
e930: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
e940: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
e950: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
e960: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
e970: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
e980: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
e990: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
e9a0: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
e9b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
e9c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e9d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e9e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e9f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
ea00: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
ea10: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
ea20: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
ea30: 72 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67  rt( iStart<=pPag
ea40: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ea50: 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ze-4 );..  /* Th
ea60: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
ea70: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
ea80: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
ea90: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
eaa0: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
eab0: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
eac0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
ead0: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
eae0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
eaf0: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
eb00: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
eb10: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
eb20: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
eb30: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
eb40: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
eb50: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
eb60: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
eb70: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
eb80: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
eb90: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
eba0: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69  (&data[iPtr]))<i
ebb0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
ebc0: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
ebd0: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  +4 ){.        if
ebe0: 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20  ( iFreeBlk==0 ) 
ebf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72  break;.        r
ec00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ec10: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
ec20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ec30: 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b  iPtr = iFreeBlk;
ec40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
ec50: 46 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70  FreeBlk>pPage->p
ec60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
ec70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ec80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ec90: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
eca0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
ecb0: 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20  FreeBlk>iPtr || 
ecc0: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20  iFreeBlk==0 );. 
ecd0: 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73   .    /* At this
ece0: 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20   point:.    **  
ecf0: 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69    iFreeBlk:   Fi
ed00: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66  rst freeblock af
ed10: 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a  ter iStart, or z
ed20: 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20  ero if none.    
ed30: 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20  **    iPtr:     
ed40: 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66    The address of
ed50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46   a pointer to iF
ed60: 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20  reeBlk.    **.  
ed70: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
ed80: 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68  e if iFreeBlk sh
ed90: 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65  ould be coalesce
eda0: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
edb0: 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f  f iStart..    */
edc0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
edd0: 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72  k && iEnd+3>=iFr
ede0: 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e  eeBlk ){.      n
edf0: 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20  Frag = iFreeBlk 
ee00: 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66  - iEnd;.      if
ee10: 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20  ( iEnd>iFreeBlk 
ee20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ee30: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
ee40: 67 65 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20  ge);.      iEnd 
ee50: 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74  = iFreeBlk + get
ee60: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
ee70: 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20  eBlk+2]);.      
ee80: 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65  if( iEnd > pPage
ee90: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
eea0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e ){.        ret
eeb0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
eec0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
eed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53        }.      iS
eee0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
eef0: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
ef00: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
ef10: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
ef20: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
ef30: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
ef40: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
ef50: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
ef60: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
ef70: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
ef80: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
ef90: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
efa0: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
efb0: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
efc0: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
efd0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
efe0: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
eff0: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
f000: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
f010: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
f020: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
f030: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
f040: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
f050: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f060: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
f070: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f080: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
f090: 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  e);.        nFra
f0a0: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
f0b0: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
f0c0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
f0d0: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
f0e0: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
f0f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f100: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
f110: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
f120: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
f130: 70 50 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61  pPage);.    data
f140: 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67  [hdr+7] -= nFrag
f150: 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32  ;.  }.  x = get2
f160: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
f170: 5d 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74  ]);.  if( iStart
f180: 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  <=x ){.    /* Th
f190: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
f1a0: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
f1b0: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
f1c0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
f1d0: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
f1e0: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
f1f0: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
f200: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
f210: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
f220: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
f230: 20 20 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c    if( iStart<x |
f240: 7c 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  | iPtr!=hdr+1 ) 
f250: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f260: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
f270: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
f280: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46  &data[hdr+1], iF
f290: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
f2a0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f2b0: 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c  5], iEnd);.  }el
f2c0: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  se{.    /* Inser
f2d0: 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c  t the new freebl
f2e0: 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65  ock into the fre
f2f0: 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74  elist */.    put
f300: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
f310: 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a  ], iStart);.  }.
f320: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
f330: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
f340: 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a  _FAST_SECURE ){.
f350: 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
f360: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
f370: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
f380: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
f390: 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70  delete.    ** op
f3a0: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
f3b0: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  */.    memset(&d
f3c0: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ata[iStart], 0, 
f3d0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75  iSize);.  }.  pu
f3e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
f3f0: 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  art], iFreeBlk);
f400: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
f410: 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69  a[iStart+2], iSi
f420: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
f430: 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65  ree += iOrigSize
f440: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f450: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
f460: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
f470: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
f480: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
f490: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
f4a0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
f4b0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
f4c0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
f4d0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
f4e0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
f4f0: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
f500: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
f510: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
f520: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
f530: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
f540: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
f550: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
f560: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
f570: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
f580: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
f590: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
f5a0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f5b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
f5c0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
f5d0: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
f5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
f5f0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
f600: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
f610: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
f620: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
f630: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
f640: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
f650: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
f660: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
f670: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
f680: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
f690: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
f6a0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
f6b0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
f6c0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
f6d0: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
f6e0: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
f6f0: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
f700: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
f710: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
f720: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
f730: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67  ge->leaf;.  pPag
f740: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
f750: 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42  ellSizePtr;.  pB
f760: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
f770: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
f780: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
f790: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
f7a0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f7b0: 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38  F: R-07291-35328
f7c0: 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30   A value of 5 (0
f7d0: 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x05) means the p
f7e0: 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  age is an.    **
f7f0: 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20   interior table 
f800: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
f810: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
f820: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
f830: 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20  TKEY)==5 );.    
f840: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f850: 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41 20  R-26900-09176 A 
f860: 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30  value of 13 (0x0
f870: 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  d) means the pag
f880: 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65  e is a.    ** le
f890: 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  af table b-tree 
f8a0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
f8b0: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
f8c0: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  TA|PTF_INTKEY|PT
f8d0: 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20  F_LEAF)==13 );. 
f8e0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f8f0: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
f900: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
f910: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f920: 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  Leaf = 1;.      
f930: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
f940: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
f950: 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65  llPtr;.    }else
f960: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
f970: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
f980: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c       pPage->xCel
f990: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
f9a0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
f9b0: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
f9c0: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
f9d0: 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f  seCellPtrNoPaylo
f9e0: 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ad;.    }.    pP
f9f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
fa00: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
fa10: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
fa20: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
fa30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
fa40: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
fa50: 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45  DATA ){.    /* E
fa60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
fa70: 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75  316-37308 A valu
fa80: 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65  e of 2 (0x02) me
fa90: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
faa0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
fab0: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  or index b-tree 
fac0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
fad0: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
fae0: 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a  TA)==2 );.    /*
faf0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fb00: 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76 61  59615-42828 A va
fb10: 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61 29  lue of 10 (0x0a)
fb20: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
fb30: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
fb40: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
fb50: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
fb60: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
fb70: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29  |PTF_LEAF)==10 )
fb80: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
fb90: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
fba0: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
fbb0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78   0;.    pPage->x
fbc0: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
fbd0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
fbe0: 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  ex;.    pPage->m
fbf0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
fc00: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
fc10: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
fc20: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
fc30: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56  }else{.    /* EV
fc40: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36  IDENCE-OF: R-476
fc50: 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68  08-56469 Any oth
fc60: 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  er value for the
fc70: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
fc80: 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65  e is.    ** an e
fc90: 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74  rror. */.    ret
fca0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fcb0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
fcc0: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
fcd0: 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
fce0: 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
fcf0: 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
fd00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fd10: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 6d  * Compute the am
fd20: 6f 75 6e 74 20 6f 66 20 66 72 65 65 73 70 61 63  ount of freespac
fd30: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  e on the page.  
fd40: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
fd50: 66 69 6c 6c 0a 2a 2a 20 69 6e 20 74 68 65 20 70  fill.** in the p
fd60: 50 61 67 65 2d 3e 6e 46 72 65 65 20 66 69 65 6c  Page->nFree fiel
fd70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
fd80: 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65   btreeComputeFre
fd90: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
fda0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63  pPage){.  int pc
fdb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
fdc0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
fdd0: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
fde0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
fdf0: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
fe00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
fe10: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
fe20: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
fe30: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
fe40: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
fe50: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
fe60: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
fe70: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
fe80: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
fe90: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
fea0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
feb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fec0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
fed0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
fee0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
fef0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ff00: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ff10: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
ff20: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
ff30: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
ff40: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
ff50: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
ff60: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
ff70: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
ff80: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
ff90: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
ffa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
ffb0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
ffc0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
ffd0: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
ffe0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
fff0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
10000 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10010 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10020 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
10030 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
10040 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
10050 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
10060 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
10070 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
10080 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
10090 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
100a0 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
100b0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
100c0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
100d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
100e0 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  nit==1 );.  asse
100f0 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
10100 3c 30 20 29 3b 0a 0a 20 20 75 73 61 62 6c 65 53  <0 );..  usableS
10110 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
10120 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
10130 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
10140 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
10150 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10160 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10170 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
10180 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
10190 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
101a0 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20  designates.  ** 
101b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
101c0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
101d0 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
101e0 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
101f0 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70  r is.  ** interp
10200 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20  reted as 65536. 
10210 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
10220 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
10230 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 43 65 6c  [hdr+5]);.  iCel
10240 6c 46 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38  lFirst = hdr + 8
10250 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
10260 74 72 53 69 7a 65 20 2b 20 32 2a 70 50 61 67 65  trSize + 2*pPage
10270 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  ->nCell;.  iCell
10280 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
10290 65 20 2d 20 34 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  e - 4;..  /* Com
102a0 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
102b0 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
102c0 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45   page.  ** EVIDE
102d0 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d  NCE-OF: R-23588-
102e0 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79  34450 The two-by
102f0 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
10300 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68 65  fset 1 gives the
10310 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74  .  ** start of t
10320 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
10330 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
10340 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
10350 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
10360 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20  freeblocks. */. 
10370 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
10380 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
10390 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
103a0 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
103b0 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
103c0 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
103d0 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70  space */.  if( p
103e0 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  c>0 ){.    u32 n
103f0 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
10400 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10410 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   ){.      /* EVI
10420 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33  DENCE-OF: R-5553
10430 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c  0-52930 In a wel
10440 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
10450 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c  page, there will
10460 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  .      ** always
10470 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
10480 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
10490 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
104a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
104b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
104c0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
104d0 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77  e); .    }.    w
104e0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
104f0 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73   if( pc>iCellLas
10500 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
10510 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68  Freeblock off th
10520 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
10530 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
10540 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10550 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
10570 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
10580 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
10590 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
105a0 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
105b0 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
105c0 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
105d0 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a  if( next<=pc+siz
105e0 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e+3 ) break;.   
105f0 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
10600 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74    }.    if( next
10610 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  >0 ){.      /* F
10620 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20  reeblock not in 
10630 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
10640 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10650 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10660 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10670 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a  }.    if( pc+siz
10680 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10690 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
106a0 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65      /* Last free
106b0 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61  block extends pa
106c0 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20  st page end */. 
106d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
106e0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
106f0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
10700 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
10710 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
10720 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
10730 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
10740 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
10750 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10760 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
10770 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
10780 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a  ytes within.  **
10790 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
107a0 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
107b0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
107c0 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
107d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
107e0 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
107f0 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
10800 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
10810 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20 74  so.  ** serves t
10820 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
10830 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10840 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
10850 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61  l-content.  ** a
10860 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  rea, according t
10870 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
10880 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  r, lies within t
10890 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  he page..  */.  
108a0 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
108b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
108c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
108d0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
108e0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
108f0 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
10900 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
10910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10920 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  K;.}../*.** Do a
10930 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
10940 20 63 68 65 63 6b 20 61 66 74 65 72 20 62 74 72   check after btr
10950 65 65 49 6e 69 74 50 61 67 65 28 29 20 69 66 0a  eeInitPage() if.
10960 2a 2a 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73  ** PRAGMA cell_s
10970 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 20 0a 2a 2f  ize_check=ON .*/
10980 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
10990 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
109a0 65 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b 28 4d  eCellSizeCheck(M
109b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
109c0 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
109d0 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
109e0 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
109f0 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
10a00 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
10a10 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
10a20 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
10a30 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
10a40 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  et */.  int i;  
10a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10a60 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
10a70 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
10a80 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b 20 20 20 20  */.  int sz;    
10a90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10aa0 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
10ab0 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
10ac0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10ad0 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
10ae0 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
10af0 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
10b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
10b10 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
10b20 74 61 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ta */.  int usab
10b30 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 4d 61  leSize;    /* Ma
10b40 78 69 6d 75 6d 20 75 73 61 62 6c 65 20 73 70 61  ximum usable spa
10b50 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
10b60 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
10b70 65 74 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20  et;    /* Start 
10b80 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
10b90 61 72 65 61 20 2a 2f 0a 0a 20 20 69 43 65 6c 6c  area */..  iCell
10ba0 46 69 72 73 74 20 3d 20 70 50 61 67 65 2d 3e 63  First = pPage->c
10bb0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
10bc0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 75 73  age->nCell;.  us
10bd0 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
10be0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
10bf0 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  e;.  iCellLast =
10c00 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
10c10 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
10c20 3e 61 44 61 74 61 3b 0a 20 20 63 65 6c 6c 4f 66  >aData;.  cellOf
10c30 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
10c40 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20  llOffset;.  if( 
10c50 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
10c60 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 66 6f  CellLast--;.  fo
10c70 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
10c80 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
10c90 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c   pc = get2byteAl
10ca0 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c  igned(&data[cell
10cb0 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
10cc0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
10cd0 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
10ce0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
10cf0 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
10d00 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
10d10 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
10d20 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
10d30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10d40 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10d50 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 70 50     }.    sz = pP
10d60 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
10d70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
10d80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10d90 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
10da0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 63 2b  e );.    if( pc+
10db0 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
10dc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10dd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10de0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
10df0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10e00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10e10 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10e20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
10e30 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
10e40 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
10e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10e60 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
10e70 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
10e80 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
10e90 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
10ea0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
10eb0 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
10ec0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
10ed0 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
10ee0 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
10ef0 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
10f00 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
10f10 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
10f20 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
10f30 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
10f40 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
10f50 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
10f60 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
10f70 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
10f80 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
10f90 7b 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  {.  u8 *data;   
10fa0 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
10fb0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
10fc0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
10fd0 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
10fe0 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
10ff0 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20 61 73 73  ucture */..  ass
11000 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
11010 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11020 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
11030 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
11040 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11050 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
11060 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11070 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
11080 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
11090 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
110a0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
110b0 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
110c0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
110d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
110e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
110f0 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
11100 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
11110 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
11120 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
11130 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Page->isInit==0 
11140 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67  );..  pBt = pPag
11150 65 2d 3e 70 42 74 3b 0a 20 20 64 61 74 61 20 3d  e->pBt;.  data =
11160 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20   pPage->aData + 
11170 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
11180 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
11190 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39  OF: R-28594-0289
111a0 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66  0 The one-byte f
111b0 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30 20  lag at offset 0 
111c0 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20  indicating.  ** 
111d0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
111e0 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64  type. */.  if( d
111f0 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
11200 2c 20 64 61 74 61 5b 30 5d 29 20 29 7b 0a 20 20  , data[0]) ){.  
11210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11220 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
11230 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
11240 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
11250 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
11260 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
11270 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
11280 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
11290 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
112a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
112b0 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  w = 0;.  pPage->
112c0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
112d0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
112e0 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  8 + pPage->child
112f0 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  PtrSize;.  pPage
11300 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 64 61 74  ->aCellIdx = dat
11310 61 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  a + pPage->child
11320 50 74 72 53 69 7a 65 20 2b 20 38 3b 0a 20 20 70  PtrSize + 8;.  p
11330 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
11340 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20   pPage->aData + 
11350 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
11360 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f  .  pPage->aDataO
11370 66 73 74 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  fst = pPage->aDa
11380 74 61 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  ta + pPage->chil
11390 64 50 74 72 53 69 7a 65 3b 0a 20 20 2f 2a 20 45  dPtrSize;.  /* E
113a0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
113b0 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77  002-32774 The tw
113c0 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
113d0 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73  t offset 3 gives
113e0 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
113f0 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
11400 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67   page. */.  pPag
11410 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
11420 79 74 65 28 26 64 61 74 61 5b 33 5d 29 3b 0a 20  yte(&data[3]);. 
11430 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
11440 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
11450 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79  {.    /* To many
11460 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
11470 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
11480 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
11490 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
114a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
114b0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
114c0 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  }.  testcase( pP
114d0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
114e0 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a  ELL(pBt) );.  /*
114f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11500 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
11510 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
11520 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
11530 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73  s only.  ** poss
11540 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
11550 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
11560 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
11570 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
11580 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74    ** offset to t
11590 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
115a0 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20  area will equal 
115b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69  the page size mi
115c0 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62 79 74  nus the.  ** byt
115d0 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73  es of reserved s
115e0 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  pace. */.  asser
115f0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
11600 30 0a 20 20 20 20 20 20 20 7c 7c 20 67 65 74 32  0.       || get2
11610 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
11620 61 5b 35 5d 29 3d 3d 28 69 6e 74 29 70 42 74 2d  a[5])==(int)pBt-
11630 3e 75 73 61 62 6c 65 53 69 7a 65 0a 20 20 20 20  >usableSize.    
11640 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
11650 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   );.  pPage->nFr
11660 65 65 20 3d 20 2d 31 3b 20 20 2f 2a 20 49 6e 64  ee = -1;  /* Ind
11670 69 63 61 74 65 20 74 68 61 74 20 74 68 69 73 20  icate that this 
11680 76 61 6c 75 65 20 69 73 20 79 65 74 20 75 6e 63  value is yet unc
11690 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20 70 50 61  omputed */.  pPa
116a0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
116b0 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
116c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
116d0 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
116e0 72 65 74 75 72 6e 20 62 74 72 65 65 43 65 6c 6c  return btreeCell
116f0 53 69 7a 65 43 68 65 63 6b 28 70 50 61 67 65 29  SizeCheck(pPage)
11700 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11710 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11720 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
11730 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
11740 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
11750 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
11760 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
11770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11780 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
11790 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
117a0 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
117b0 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
117c0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
117d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
117e0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
117f0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
11800 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
11810 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
11820 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
11830 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
11840 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
11850 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
11860 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11870 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
11880 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
11890 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
118a0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
118b0 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
118c0 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
118d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
118e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
118f0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
11900 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
11910 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11920 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11930 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
11940 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
11950 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d  _SECURE ){.    m
11960 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
11970 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
11980 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
11990 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
119a0 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
119b0 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c  rst = hdr + ((fl
119c0 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
119d0 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65   ? 12 : 8);.  me
119e0 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
119f0 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
11a00 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
11a10 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
11a20 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
11a30 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
11a40 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70  >nFree = (u16)(p
11a50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
11a60 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64   first);.  decod
11a70 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
11a80 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63  ags);.  pPage->c
11a90 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
11aa0 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
11ab0 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
11ac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
11ad0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
11ae0 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
11af0 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f  .  pPage->aDataO
11b00 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67  fst = &data[pPag
11b10 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
11b20 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
11b30 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
11b40 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
11b50 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
11b60 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
11b70 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
11b80 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
11b90 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
11ba0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
11bb0 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
11bc0 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
11bd0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
11be0 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
11bf0 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
11c00 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
11c10 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
11c20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
11c30 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
11c40 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
11c50 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
11c60 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
11c70 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
11c80 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
11c90 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
11ca0 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
11cb0 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  age);.  if( pgno
11cc0 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b  !=pPage->pgno ){
11cd0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74  .    pPage->aDat
11ce0 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
11cf0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
11d00 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62  ;.    pPage->pDb
11d10 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
11d20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
11d30 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d   pBt;.    pPage-
11d40 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
11d50 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
11d60 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31  et = pgno==1 ? 1
11d70 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73  00 : 0;.  }.  as
11d80 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
11d90 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ta==sqlite3Pager
11da0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
11db0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
11dc0 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
11dd0 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
11de0 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
11df0 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
11e00 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
11e10 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
11e20 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53  ts if needed.  S
11e30 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65  ee also: btreeGe
11e40 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a  tUnusedPage()..*
11e50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45  *.** If the PAGE
11e60 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
11e70 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
11e80 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
11e90 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f   not care.** abo
11ea0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
11eb0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
11ec0 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
11ed0 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
11ee0 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
11ef0 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
11f00 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
11f10 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
11f20 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
11f30 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
11f40 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
11f50 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
11f60 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
11f70 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
11f80 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
11f90 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
11fa0 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
11fb0 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
11fc0 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
11fd0 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
11fe0 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
11ff0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12000 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
12010 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
12020 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
12030 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
12040 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
12050 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
12060 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
12070 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
12080 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
12090 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
120a0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
120b0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
120c0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
120d0 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
120e0 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
120f0 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
12100 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
12110 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
12120 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
12130 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
12140 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
12150 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12160 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
12170 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
12180 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
12190 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
121a0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
121b0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
121c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
121d0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
121e0 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
121f0 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
12200 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
12210 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12220 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
12230 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
12240 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
12250 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
12260 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
12270 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
12280 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
12290 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
122a0 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
122b0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
122c0 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
122d0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
122e0 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
122f0 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
12300 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
12310 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
12320 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
12330 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12340 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
12350 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
12360 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
12370 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
12380 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
12390 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
123a0 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
123b0 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
123c0 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
123d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
123e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
123f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
12400 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
12410 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
12420 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
12430 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
12440 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
12450 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
12460 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
12470 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
12480 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
12490 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
124a0 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
124b0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
124c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
124d0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
124e0 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
124f0 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
12500 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
12510 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f  turn btreePageco
12520 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
12530 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
12540 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
12550 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
12560 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72  t..**.** If pCur
12570 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
12580 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68  e is being fetch
12590 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
125a0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a  moveToChild().**
125b0 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74   call.  Do addit
125c0 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ional sanity che
125d0 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
125e0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
125f0 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65  ** And if the fe
12600 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20  tch fails, this 
12610 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63  routine must dec
12620 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61  rement pCur->iPa
12630 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
12640 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73  ge is fetched as
12650 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65   read-write unle
12660 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e  ss pCur is not N
12670 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20  ULL and is.** a 
12680 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
12690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
126a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
126b0 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65   *ppPage is unde
126c0 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
126d0 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
126e0 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
126f0 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
12700 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
12710 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
12720 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
12730 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
12740 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12750 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
12760 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12790 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
127a0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
127b0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
127c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
127d0 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
127e0 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ere */.  BtCurso
127f0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
12800 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
12810 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68  or to receive th
12820 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20  e page, or NULL 
12830 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e  */.  int bReadOn
12840 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ly              
12850 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
12860 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67   a read-only pag
12870 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
12880 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
12890 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
128a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
128b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
128c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
128d0 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70  =0 || ppPage==&p
128e0 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
128f0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
12900 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43  || bReadOnly==pC
12910 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
12920 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
12930 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  Cur==0 || pCur->
12940 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66  iPage>0 );..  if
12950 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
12960 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
12970 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
12980 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
12990 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
129a0 61 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20 7d 0a  age_error1;.  }.
129b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
129c0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
129d0 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
129e0 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52  e**)&pDbPage, bR
129f0 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20  eadOnly);.  if( 
12a00 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67  rc ){.    goto g
12a10 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
12a20 72 6f 72 31 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  ror1;.  }.  *ppP
12a30 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
12a40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
12a50 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
12a60 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
12a70 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
12a80 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
12a90 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
12aa0 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63  no, pBt);.    rc
12ab0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
12ac0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
12ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12ae0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67   ){.      goto g
12af0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
12b00 72 6f 72 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ror2;.    }.  }.
12b10 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
12b20 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
12b30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
12b40 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73  pPage)->aData==s
12b50 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12b60 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  ta(pDbPage) );..
12b70 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e    /* If obtainin
12b80 67 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66  g a child page f
12b90 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20  or a cursor, we 
12ba0 6d 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74  must verify that
12bb0 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a   the page is.  *
12bc0 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  * compatible wit
12bd0 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e  h the root page.
12be0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26   */.  if( pCur &
12bf0 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43  & ((*ppPage)->nC
12c00 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67  ell<1 || (*ppPag
12c10 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  e)->intKey!=pCur
12c20 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a  ->curIntKey) ){.
12c30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12c40 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e  CORRUPT_PGNO(pgn
12c50 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  o);.    goto get
12c60 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
12c70 72 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r2;.  }.  return
12c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74   SQLITE_OK;..get
12c90 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
12ca0 72 32 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  r2:.  releasePag
12cb0 65 28 2a 70 70 50 61 67 65 29 3b 0a 67 65 74 41  e(*ppPage);.getA
12cc0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
12cd0 31 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b  1:.  if( pCur ){
12ce0 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
12cf0 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  --;.    pCur->pP
12d00 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
12d10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
12d20 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
12d30 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
12d40 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
12d50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
12d60 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
12d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
12d80 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
12d90 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
12da0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
12db0 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
12dc0 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
12dd0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20  ge..**.** Page1 
12de0 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  is a special cas
12df0 65 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  e and must be re
12e00 6c 65 61 73 65 64 20 75 73 69 6e 67 20 72 65 6c  leased using rel
12e10 65 61 73 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a  easePageOne()..*
12e20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
12e30 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
12e40 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12e50 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
12e60 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
12e70 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
12e80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12e90 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
12ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12eb0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
12ec0 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
12ed0 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
12ee0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
12ef0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12f00 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
12f10 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
12f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12f30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12f40 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
12f50 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
12f60 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
12f70 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
12f80 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
12f90 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
12fa0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
12fb0 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
12fc0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
12fd0 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
12fe0 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
12ff0 4f 6e 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  One(MemPage *pPa
13000 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
13010 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
13020 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
13030 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
13040 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
13050 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
13060 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
13070 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13080 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
13090 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
130a0 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
130b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
130c0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
130d0 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
130e0 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
130f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13100 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
13110 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
13120 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
13130 72 65 66 50 61 67 65 4f 6e 65 28 70 50 61 67 65  refPageOne(pPage
13140 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ->pDbPage);.}../
13150 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
13160 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
13170 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
13180 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
13190 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
131a0 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
131b0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
131c0 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
131d0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
131e0 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
131f0 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
13200 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
13210 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
13220 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
13230 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
13240 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
13250 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
13260 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
13270 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
13280 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
13290 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
132a0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
132b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
132c0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
132d0 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
132e0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
132f0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
13300 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
13310 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
13320 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
13330 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
13340 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
13350 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
13360 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
13370 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
13380 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
13390 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
133a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
133b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
133c0 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
133d0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
133e0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
133f0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
13400 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
13410 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
13420 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
13430 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
13440 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
13450 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
13460 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
13470 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13480 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
13490 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
134a0 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
134b0 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
134c0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
134d0 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
134e0 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
134f0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
13500 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
13510 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
13520 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
13530 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
13540 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
13550 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
13560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
13570 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
13580 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
13590 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
135a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
135b0 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
135c0 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
135d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
135e0 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
135f0 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
13600 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
13610 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
13620 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
13630 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
13640 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13650 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
13660 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
13670 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
13680 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
13690 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
136a0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
136b0 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
136c0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
136d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
136e0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
136f0 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
13700 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
13710 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
13720 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
13730 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
13740 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
13750 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
13760 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
13770 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
13780 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
13790 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
137a0 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
137b0 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
137c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
137d0 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
137e0 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
137f0 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
13800 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
13810 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
13820 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
13830 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
13840 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
13850 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
13860 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
13870 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
13880 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
13890 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
138a0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
138b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
138c0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
138d0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
138e0 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
138f0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
13900 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
13910 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
13920 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
13930 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
13940 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
13950 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
13960 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13970 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
13980 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
13990 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
139a0 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
139b0 3e 62 75 73 79 48 61 6e 64 6c 65 72 2c 0a 20 20  >busyHandler,.  
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
139f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 3b 0a  (pBt->pPager));.
13a00 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
13a10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
13a20 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
13a30 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
13a40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13a50 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
13a60 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
13a70 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
13a80 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
13a90 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
13aa0 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
13ab0 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
13ac0 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
13ad0 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
13ae0 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
13af0 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
13b00 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
13b10 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
13b20 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
13b30 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
13b40 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
13b50 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
13b60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
13b70 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
13b80 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
13b90 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
13ba0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
13bb0 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
13bc0 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
13bd0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
13be0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
13bf0 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
13c00 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
13c10 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
13c20 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
13c30 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
13c40 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
13c50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
13c60 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
13c70 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
13c80 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
13c90 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
13ca0 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
13cb0 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
13cc0 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
13cd0 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
13ce0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13cf0 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
13d00 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
13d10 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
13d20 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
13d30 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
13d40 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
13d50 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
13d60 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
13d70 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
13d80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13d90 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
13da0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
13db0 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
13dc0 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
13dd0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13de0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
13df0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
13e00 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
13e10 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
13e20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
13e30 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
13e40 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
13e50 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
13e60 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
13e70 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
13e80 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
13e90 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
13ea0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
13eb0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13ec0 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
13ed0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
13ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
13ef0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
13f00 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
13f10 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
13f20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13f30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13f40 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
13f50 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
13f60 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
13f90 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
13fa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
13fb0 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
13fc0 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
13fd0 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
13fe0 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
13ff0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14000 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14010 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
14020 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
14030 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14050 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
14060 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
14070 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
14080 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
14090 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
140a0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
140b0 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
140c0 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
140d0 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
140e0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
140f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
14100 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
14110 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
14120 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
14130 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
14140 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
14150 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
14160 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
14170 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
14180 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
14190 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
141a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
141b0 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
141c0 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
141d0 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
141e0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
141f0 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
14200 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
14210 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
14240 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
14250 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
14280 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
14290 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
142a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
142b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
142c0 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
142d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
142e0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
142f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
14300 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
14310 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
14320 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
14330 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
14340 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
14350 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
14360 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
14370 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
14380 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
14390 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
143a0 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
143b0 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
143c0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
143d0 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
143e0 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
143f0 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
14400 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
14410 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
14420 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
14430 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
14440 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
14450 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
14460 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
14470 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
14480 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
14490 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
144a0 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
144b0 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
144c0 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
144d0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
144e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
144f0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
14500 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
14510 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
14520 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
14530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
14540 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
14550 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
14560 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
14570 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
14580 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
14590 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
145a0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
145b0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
145c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
145d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
145e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
145f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
14600 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
14610 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
14620 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
14630 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
14640 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
14650 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
14660 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
14670 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
14680 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
14690 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
146a0 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
146b0 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
146c0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
146d0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
146e0 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
146f0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
14700 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
14710 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
14720 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
14730 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
14740 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
14750 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
14760 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
14770 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
14780 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
14790 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
147a0 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
147b0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
147c0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
147d0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
147e0 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
147f0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
14800 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
14810 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
14820 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
14830 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14840 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14860 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
14870 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
14880 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
14890 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
148a0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
148b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
148c0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
148d0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
148e0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
14910 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
14920 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
14930 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14940 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14950 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
14960 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14970 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
14980 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
149a0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
149b0 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
149c0 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
149d0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
149e0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
149f0 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
14a00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14a10 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
14a20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
14a30 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
14a40 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
14a50 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
14a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14a70 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
14a80 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
14a90 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
14aa0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14ab0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14ac0 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
14ad0 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
14ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
14af0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
14b00 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
14b10 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
14b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
14b30 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
14b40 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
14b50 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
14b60 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
14b70 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
14b80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
14b90 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
14ba0 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
14bb0 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
14bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
14bd0 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
14be0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
14bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
14c00 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
14c10 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
14c20 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
14c30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14c40 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
14c50 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
14c60 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14c70 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
14c80 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
14c90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14ca0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14cc0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14ce0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
14cf0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
14d00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
14d10 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
14d20 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
14d30 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
14d40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14d60 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
14d70 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14d80 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
14d90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
14da0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
14db0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14dc0 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
14dd0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
14de0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
14df0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
14e00 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
14e10 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
14e20 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
14e30 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
14e40 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
14e50 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
14e60 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
14e70 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
14e80 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
14e90 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
14ea0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
14eb0 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
14ec0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
14ed0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
14ee0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
14ef0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
14f00 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
14f10 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
14f20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
14f30 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
14f40 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
14f50 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
14f60 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
14f70 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
14f80 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
14f90 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
14fa0 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
14fb0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
14fc0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
14fd0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
14fe0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
14ff0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
15000 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
15010 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
15020 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
15030 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
15040 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
15050 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
15060 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15070 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
15080 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
15090 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
150a0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
150b0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
150c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
150d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
150e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
150f0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
15100 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
15110 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
15120 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
15130 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65         sizeof(Me
15160 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76  mPage), flags, v
15170 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
15180 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
15190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
151a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
151b0 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
151c0 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
151d0 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
151e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
151f0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
15200 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
15210 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
15220 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
15230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
15250 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
15260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
15270 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
15280 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
15290 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
152a0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
152b0 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yHandler(pBt->pP
152c0 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
152d0 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
152e0 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
152f0 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
15300 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
15310 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
15320 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
15330 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
15340 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
15350 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
15360 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
15370 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
15380 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
15390 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  TE).    pBt->bts
153a0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
153b0 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69  URE_DELETE;.#eli
153c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
153d0 5f 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c  _FAST_SECURE_DEL
153e0 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74  ETE).    pBt->bt
153f0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56  sFlags |= BTS_OV
15400 45 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  ERWRITE;.#endif.
15410 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
15420 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
15430 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
15440 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
15450 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
15460 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
15470 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
15480 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
15490 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
154a0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
154b0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
154c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
154d0 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
154e0 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
154f0 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
15500 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
15510 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
15520 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
15530 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
15540 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
15550 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
15560 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
15570 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
15580 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
15590 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
155a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
155b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
155c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
155d0 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
155e0 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
155f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
15600 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
15610 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
15620 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
15630 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
15640 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
15650 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
15660 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
15670 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
15680 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
15690 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
156a0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
156b0 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
156c0 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
156d0 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
156e0 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
156f0 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
15700 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
15710 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
15720 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
15730 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
15740 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
15750 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
15760 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
15770 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
15780 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
15790 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
157a0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
157b0 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
157c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
157d0 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
157e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
157f0 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
15800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
15810 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
15820 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
15830 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
15840 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
15850 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
15860 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
15870 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
15880 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
15890 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
158a0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
158b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
158c0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
158d0 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
158e0 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
158f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15900 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
15910 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
15920 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
15930 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
15940 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
15950 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
15960 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
15970 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
15980 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15990 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
159a0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
159b0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
159c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
159d0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
159e0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
159f0 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
15a00 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
15a10 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
15a20 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
15a30 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
15a40 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
15a50 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
15a60 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
15a70 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
15a80 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
15a90 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
15aa0 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
15ab0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15ac0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
15ad0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15ae0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
15af0 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
15b00 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
15b10 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
15b20 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
15b30 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
15b40 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
15b50 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
15b60 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
15b70 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15b80 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
15b90 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54  red; ).      MUT
15ba0 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
15bb0 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
15bc0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15bd0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
15be0 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
15bf0 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
15c00 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
15c10 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
15c20 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
15c30 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
15c40 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15c50 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
15c60 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
15c70 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
15c80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15c90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
15ca0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
15cb0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
15cc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15cd0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15ce0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
15cf0 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
15d00 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
15d10 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15d20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15d30 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
15d40 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15d50 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15d60 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
15d70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
15d80 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
15d90 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
15da0 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
15db0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15dc0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
15dd0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15de0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
15df0 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
15e00 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
15e10 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
15e20 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
15e30 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
15e40 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
15e50 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
15e60 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
15e70 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
15e80 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
15e90 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
15ea0 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
15eb0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
15ec0 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
15ed0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
15ee0 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
15ef0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
15f00 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
15f10 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
15f20 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
15f30 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
15f40 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
15f50 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
15f60 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
15f70 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
15f80 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c  f( (uptr)p->pBt<
15f90 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20  (uptr)pSib->pBt 
15fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
15fb0 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
15fc0 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
15fd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15fe0 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
15ff0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16000 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
16010 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
16020 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78  (uptr)pSib->pNex
16030 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e  t->pBt<(uptr)p->
16040 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
16050 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
16060 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
16070 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
16080 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
16090 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
160a0 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
160b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
160c0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
160d0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
160e0 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
160f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16100 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
16110 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16120 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16130 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
16140 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
16150 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
16160 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
16170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16180 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
16190 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
161a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
161b0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
161c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
161d0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
161e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
161f0 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
16200 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
16210 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
16220 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a   *pFile;..    /*
16230 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
16240 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
16250 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
16260 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
16270 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
16280 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
16290 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
162a0 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
162b0 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
162c0 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
162d0 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
162e0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
162f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16300 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
16310 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
16320 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
16330 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
16340 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
16350 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16360 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
16370 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20   }..    pFile = 
16380 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
16390 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
163a0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d     if( pFile->pM
163b0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
163c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
163d0 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20  trolHint(pFile, 
163e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42  SQLITE_FCNTL_PDB
163f0 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64  , (void*)&pBt->d
16400 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
16410 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
16420 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
16430 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16440 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
16450 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16460 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
16470 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
16490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e   sqlite3BtreeCon
164a0 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70  nectionCount(*pp
164b0 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65  Btree)>0 );.  re
164c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
164d0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
164e0 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
164f0 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
16500 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
16510 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
16520 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
16530 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
16540 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
16550 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
16560 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
16570 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
16580 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
16590 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
165a0 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
165b0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
165c0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
165d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
165e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
165f0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16600 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
16610 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
16620 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
16630 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
16640 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
16650 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
16660 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
16670 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
16680 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
16690 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
166a0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
166b0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
166c0 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
166d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
166e0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
166f0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
16700 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
16710 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
16720 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
16730 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
16740 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
16750 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
16760 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
16770 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
16780 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
16790 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
167a0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
167b0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
167c0 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
167d0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
167e0 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
167f0 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
16800 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
16810 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
16820 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
16830 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
16840 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
16850 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
16860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16870 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
16880 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
16890 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
168a0 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
168b0 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
168c0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
168d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
168e0 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
168f0 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
16900 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
16910 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
16920 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
16930 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
16940 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
16950 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
16960 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
16970 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
16980 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
16990 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
169a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
169b0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
169c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
169d0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
169e0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
169f0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
16a00 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
16a10 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
16a20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
16a30 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
16a40 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
16a50 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
16a60 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
16a70 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
16a80 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
16a90 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
16aa0 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
16ab0 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
16ac0 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
16ad0 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
16ae0 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
16af0 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
16b00 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
16b10 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
16b20 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
16b30 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
16b40 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
16b50 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
16b60 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
16b70 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
16b80 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
16b90 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
16ba0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
16bb0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
16bc0 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
16bd0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
16be0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
16bf0 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
16c00 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
16c10 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
16c20 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
16c30 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
16c40 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
16c50 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
16c60 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
16c70 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
16c80 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
16c90 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
16ca0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
16cb0 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
16cc0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
16cd0 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
16ce0 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
16cf0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
16d00 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
16d10 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
16d20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
16d30 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
16d40 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
16d50 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
16d60 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
16d70 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
16d80 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
16d90 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
16da0 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
16db0 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
16dc0 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
16dd0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16de0 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
16df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
16e00 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
16e10 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
16e20 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
16e30 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
16e40 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
16e50 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
16e60 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
16e70 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
16e80 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
16e90 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
16ea0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16eb0 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
16ec0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
16ed0 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
16ee0 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
16ef0 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
16f00 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
16f10 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
16f20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16f30 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
16f40 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
16f50 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
16f60 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
16f70 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
16f80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16f90 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16fa0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16fb0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16fc0 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
16fd0 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
16fe0 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
16ff0 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
17000 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
17010 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
17020 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
17030 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
17040 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
17050 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
17060 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
17070 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
17080 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
17090 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
170a0 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
170b0 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
170c0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
170d0 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
170e0 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
170f0 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
17100 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
17110 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
17120 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
17130 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17140 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
17150 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
17160 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
17170 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
17180 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
17190 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
171a0 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
171b0 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
171c0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
171d0 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
171e0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
171f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17200 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
17210 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
17220 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
17230 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
17240 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
17250 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
17260 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
17270 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
17280 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
17290 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
172a0 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
172b0 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
172c0 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
172d0 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
172e0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
172f0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
17300 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
17310 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
17320 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
17330 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
17340 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  ager, p->db);.  
17350 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
17360 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
17370 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
17380 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
17390 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
173a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
173b0 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
173c0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
173d0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
173e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
173f0 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
17400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17410 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
17420 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
17430 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
17440 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
17450 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
17460 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
17470 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
17480 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
17490 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
174a0 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
174b0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
174c0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
174d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
174e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
174f0 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74  the "soft" limit
17500 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
17510 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
17520 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20  ache..** Unused 
17530 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70  and unmodified p
17540 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ages will be rec
17550 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ycled when the n
17560 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
17570 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65  s in the cache e
17580 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74  xceeds this soft
17590 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65   limit.  But the
175a0 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
175b0 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64  cache is allowed
175c0 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20   to grow larger 
175d0 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20  than this limit 
175e0 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  if it contains.*
175f0 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72  * dirty pages or
17600 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20   pages still in 
17610 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69  active use..*/.i
17620 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
17630 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
17640 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
17650 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
17660 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
17670 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17680 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
17690 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
176a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
176b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
176c0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
176d0 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
176e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
176f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17700 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17710 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
17720 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69  the "spill" limi
17730 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
17740 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
17750 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65  cache..** If the
17760 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
17770 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69   exceeds this li
17780 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69  mit during a wri
17790 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  te transaction,.
177a0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67  ** the pager mig
177b0 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73  ht attempt to "s
177c0 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74  pill" pages to t
177d0 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79  he journal early
177e0 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20   in.** order to 
177f0 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a  free up memory..
17800 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
17810 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
17820 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
17830 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20  ze.  If zero is 
17840 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20  passed.** as an 
17850 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61  argument, no cha
17860 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
17870 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20   the spill size 
17880 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75  setting, so.** u
17890 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30  sing mxPage of 0
178a0 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65   is a way to que
178b0 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
178c0 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e  pill size..*/.in
178d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
178e0 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65  tSpillSize(Btree
178f0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
17900 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
17910 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
17920 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
17930 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17940 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17950 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17960 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
17970 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  es = sqlite3Page
17980 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42  rSetSpillsize(pB
17990 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
179a0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
179b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
179c0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
179d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
179e0 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
179f0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
17a00 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
17a10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17a20 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
17a30 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
17a40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17a50 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
17a60 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
17a70 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
17a80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17a90 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17aa0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17ab0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
17ac0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
17ad0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17ae0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
17af0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
17b00 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
17b10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17b20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17b30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17b40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17b50 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
17b60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
17b70 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
17b80 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
17b90 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
17ba0 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
17bb0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
17bc0 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
17bd0 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
17be0 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
17bf0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
17c00 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
17c10 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
17c20 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
17c30 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
17c40 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
17c50 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
17c60 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
17c70 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
17c80 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
17c90 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
17ca0 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
17cb0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
17cc0 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
17cd0 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
17ce0 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
17cf0 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
17d00 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
17d10 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
17d20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17d30 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
17d40 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
17d50 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
17d60 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
17d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17d80 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
17d90 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
17da0 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
17db0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
17dc0 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
17dd0 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
17de0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17df0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
17e00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17e10 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
17e20 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
17e30 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17e40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
17e50 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
17e60 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
17e70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17e80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
17e90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17ea0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
17eb0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
17ec0 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
17ed0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
17ee0 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
17ef0 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
17f00 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
17f10 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
17f20 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
17f30 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
17f40 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
17f50 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
17f60 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
17f70 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
17f80 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
17f90 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
17fa0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
17fb0 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
17fc0 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
17fd0 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
17fe0 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
17ff0 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
18000 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
18010 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
18020 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
18030 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
18040 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
18050 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
18060 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
18070 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
18080 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
18090 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
180a0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
180b0 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
180c0 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
180d0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
180e0 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
180f0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
18100 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
18110 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
18120 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
18130 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
18140 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
18150 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
18160 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
18170 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41   then the BTS_PA
18180 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61  GESIZE_FIXED fla
18190 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
181a0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
181b0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
181c0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
181d0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
181e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
181f0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
18200 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
18210 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
18220 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
18230 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18240 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
18250 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18260 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
18270 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
18280 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
18290 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
182a0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  );.#if SQLITE_HA
182b0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52  S_CODEC.  if( nR
182c0 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69  eserve>pBt->opti
182d0 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74  malReserve ) pBt
182e0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
182f0 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b   = (u8)nReserve;
18300 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
18310 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
18320 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
18330 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
18340 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18360 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
18370 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
18380 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
18390 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
183a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
183b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
183c0 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
183d0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
183e0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
183f0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
18400 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
18410 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
18420 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
18430 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
18440 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
18450 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
18460 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
18470 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
18480 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
18490 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
184a0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
184b0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
184c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
184d0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
184e0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
184f0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
18500 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
18510 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
18520 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
18530 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
18540 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
18550 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
18560 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
18570 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18590 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
185a0 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
185b0 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
185c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
185d0 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
185e0 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
185f0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
18600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
18610 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
18620 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
18630 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
18640 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
18650 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
18660 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
18670 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
18680 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
18690 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
186a0 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
186b0 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
186c0 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
186d0 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
186e0 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
186f0 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
18700 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
18710 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
18720 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
18730 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
18740 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
18750 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
18760 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
18770 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
18780 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
18790 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
187a0 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
187b0 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
187c0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
187d0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
187e0 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
187f0 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
18800 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
18810 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
18820 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
18830 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
18840 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18850 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
18860 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18870 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
18880 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
18890 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74  sableSize;.  ret
188a0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
188b0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
188c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
188d0 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
188e0 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
188f0 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
18900 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
18910 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
18920 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
18930 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
18940 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
18950 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  ensions..**.** I
18960 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54  f SQLITE_HAS_MUT
18970 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  EX is defined th
18980 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65  en the number re
18990 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
189a0 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20   greater of the 
189b0 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64  current reserved
189c0 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d   space and the m
189d0 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64  aximum requested
189e0 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63  .** reserve spac
189f0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18a00 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c  3BtreeGetOptimal
18a10 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
18a20 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
18a30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18a40 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
18a50 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
18a60 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64  NoMutex(p);.#ifd
18a70 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
18a80 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70  DEC.  if( n<p->p
18a90 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
18aa0 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  ve ) n = p->pBt-
18ab0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b  >optimalReserve;
18ac0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18ad0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18ae0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
18af0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
18b00 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
18b10 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
18b20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
18b30 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
18b40 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
18b50 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
18b60 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
18b70 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
18b80 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
18b90 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
18ba0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
18bb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18bc0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
18bd0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
18be0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
18bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18c00 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
18c10 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
18c20 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
18c30 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
18c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18c50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18c60 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  n;.}../*.** Chan
18c70 67 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ge the values fo
18c80 72 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  r the BTS_SECURE
18c90 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f  _DELETE and BTS_
18ca0 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a  OVERWRITE flags:
18cb0 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  .**.**    newFla
18cc0 67 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20  g==0       Both 
18cd0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18ce0 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  E and BTS_OVERWR
18cf0 49 54 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a  ITE are cleared.
18d00 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31  **    newFlag==1
18d10 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52         BTS_SECUR
18d20 45 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64  E_DELETE set and
18d30 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69   BTS_OVERWRITE i
18d40 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20  s cleared.**    
18d50 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20  newFlag==2      
18d60 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18d70 54 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42  TE cleared and B
18d80 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  TS_OVERWRITE is 
18d90 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  set.**    newFla
18da0 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68  g==(-1)    No ch
18db0 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73  anges.**.** This
18dc0 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73   routine acts as
18dd0 20 61 20 71 75 65 72 79 20 69 66 20 6e 65 77 46   a query if newF
18de0 6c 61 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  lag is less than
18df0 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68   zero.**.** With
18e00 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73   BTS_OVERWRITE s
18e10 65 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  et, deleted cont
18e20 65 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74 74  ent is overwritt
18e30 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74  en by zeros, but
18e40 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61  .** freelist lea
18e50 66 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  f pages are not 
18e60 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
18e70 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
18e80 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64  hus in-page.** d
18e90 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
18ea0 73 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66  s cleared, but f
18eb0 72 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20  reelist deleted 
18ec0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a  content is not..
18ed0 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53  **.** With BTS_S
18ee0 45 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70  ECURE_DELETE, op
18ef0 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20  eration is like 
18f00 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69  BTS_OVERWRITE wi
18f10 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a  th the addition.
18f20 2a 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73 74  ** that freelist
18f30 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
18f40 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
18f50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
18f60 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68  increasing.** th
18f70 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b  e amount of disk
18f80 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   I/O..*/.int sql
18f90 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
18fa0 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
18fb0 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
18fc0 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
18fd0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18fe0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18ff0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
19000 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42  BTS_OVERWRITE==B
19010 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
19020 2a 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *2 );.  assert( 
19030 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d  BTS_FAST_SECURE=
19040 3d 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c  =(BTS_OVERWRITE|
19050 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
19060 45 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  E) );.  if( newF
19070 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
19080 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
19090 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55  = ~BTS_FAST_SECU
190a0 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e  RE;.    p->pBt->
190b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
190c0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65  SECURE_DELETE*ne
190d0 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d  wFlag;.  }.  b =
190e0 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
190f0 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45  gs & BTS_FAST_SE
19100 43 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45  CURE)/BTS_SECURE
19110 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74  _DELETE;.  sqlit
19120 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19130 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
19140 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19150 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
19160 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
19170 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
19180 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
19190 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
191a0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
191b0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
191c0 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
191d0 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
191e0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
191f0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
19200 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
19210 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
19220 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
19230 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
19240 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
19250 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19260 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
19270 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
19280 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
19290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
192a0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
192b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
192c0 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
192d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
192e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
192f0 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
19300 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
19310 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
19320 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
19330 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
19340 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
19350 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
19360 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
19370 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
19380 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
19390 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
193a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
193b0 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
193c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
193d0 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
193e0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
193f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19400 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
19410 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19420 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
19430 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
19440 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
19450 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
19460 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
19470 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
19480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19490 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
194a0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
194b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
194c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
194d0 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
194e0 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
194f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
19500 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19510 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
19520 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
19530 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
19540 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
19550 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
19560 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
19570 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
19580 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
19590 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
195a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
195b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
195c0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
195d0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
195e0 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61  s not set the sa
195f0 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74  fety-level for t
19600 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
19610 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67  nection.** using
19620 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f   "PRAGMA synchro
19630 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68  nous", and if th
19640 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69  e safety-level i
19650 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
19660 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
19670 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
19680 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65   function as the
19690 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
196a0 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e  r,.** set it so.
196b0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .*/.#if SQLITE_D
196c0 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
196d0 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55  US!=SQLITE_DEFAU
196e0 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
196f0 55 53 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66  US \.    && !def
19700 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19710 5f 57 41 4c 29 0a 73 74 61 74 69 63 20 76 6f 69  _WAL).static voi
19720 64 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  d setDefaultSync
19730 46 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70  Flag(BtShared *p
19740 42 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65  Bt, u8 safety_le
19750 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  vel){.  sqlite3 
19760 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  *db;.  Db *pDb;.
19770 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64    if( (db=pBt->d
19780 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62  b)!=0 && (pDb=db
19790 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  ->aDb)!=0 ){.   
197a0 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
197b0 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
197c0 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
197d0 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44  ++; }.    if( pD
197e0 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a  b->bSyncSet==0 .
197f0 20 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66       && pDb->saf
19800 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74  ety_level!=safet
19810 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26  y_level .     &&
19820 20 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31   pDb!=&db->aDb[1
19830 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ] .    ){.      
19840 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
19850 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  l = safety_level
19860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
19870 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
19880 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  ->pPager,.      
19890 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
198a0 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61  level | (db->fla
198b0 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53  gs & PAGER_FLAGS
198c0 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20  _MASK));.    }. 
198d0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
198e0 69 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79  ine setDefaultSy
198f0 6e 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74  ncFlag(pBt,safet
19900 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a  y_level).#endif.
19910 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
19920 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
19930 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
19940 65 28 42 74 53 68 61 72 65 64 2a 29 3b 0a 0a 0a  e(BtShared*);...
19950 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
19960 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
19970 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19980 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
19990 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
199a0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
199b0 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
199c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
199d0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
199e0 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
199f0 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
19a00 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
19a10 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
19a20 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
19a30 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
19a40 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
19a50 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
19a60 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
19a70 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
19a80 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
19a90 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
19aa0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
19ab0 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
19ac0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
19ad0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19ae0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
19af0 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
19b00 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
19b10 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
19b20 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
19b30 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
19b40 20 20 75 33 32 20 6e 50 61 67 65 3b 20 20 20 20    u32 nPage;    
19b50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19b60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
19b70 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
19b80 33 32 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  32 nPageFile = 0
19b90 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
19ba0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
19bb0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
19bc0 20 75 33 32 20 6e 50 61 67 65 48 65 61 64 65 72   u32 nPageHeader
19bd0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
19be0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
19bf0 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
19c00 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
19c10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19c20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
19c30 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
19c40 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
19c50 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
19c60 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
19c70 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
19c80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19c90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19ca0 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
19cb0 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
19cc0 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
19cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19ce0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
19cf0 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
19d00 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
19d10 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
19d20 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
19d30 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
19d40 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
19d50 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
19d60 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
19d70 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
19d80 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
19d90 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19da0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
19db0 28 69 6e 74 2a 29 26 6e 50 61 67 65 46 69 6c 65  (int*)&nPageFile
19dc0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
19dd0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
19de0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
19df0 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
19e00 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
19e10 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
19e20 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
19e30 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  f( (pBt->db->fla
19e40 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65  gs & SQLITE_Rese
19e50 74 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 7b  tDatabase)!=0 ){
19e60 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 30 3b 0a  .    nPage = 0;.
19e70 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
19e80 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
19e90 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
19ea0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
19eb0 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
19ec0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
19ed0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
19ee0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19ef0 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
19f00 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
19f10 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
19f20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
19f30 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
19f40 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
19f50 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
19f60 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
19f70 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
19f80 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
19f90 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
19fa0 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
19fb0 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
19fc0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19fd0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19fe0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
19ff0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1a000 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
1a010 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
1a020 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1a030 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
1a040 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
1a050 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
1a060 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1a070 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
1a080 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
1a090 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
1a0a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1a0b0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
1a0c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
1a0d0 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
1a0e0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1a0f0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1a100 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
1a110 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
1a120 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
1a130 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
1a140 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
1a150 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
1a160 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
1a170 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
1a180 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
1a190 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
1a1a0 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
1a1b0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
1a1c0 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
1a1d0 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
1a1e0 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
1a1f0 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
1a200 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
1a210 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
1a220 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
1a230 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
1a240 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
1a250 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
1a260 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
1a270 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
1a280 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
1a290 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
1a2a0 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
1a2b0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
1a2c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
1a2d0 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
1a2e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1a2f0 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
1a300 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
1a310 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1a320 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1a330 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
1a340 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
1a350 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a360 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1a370 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1a380 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
1a390 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 44  se{.        setD
1a3a0 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
1a3b0 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  Bt, SQLITE_DEFAU
1a3c0 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
1a3d0 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  US+1);.        i
1a3e0 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
1a3f0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1a400 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1a410 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1a420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a440 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a450 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65  E_NOTADB;.    }e
1a460 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65  lse{.      setDe
1a470 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
1a480 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
1a490 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  T_SYNCHRONOUS+1)
1a4a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1a4b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a4c0 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
1a4d0 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
1a4e0 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
1a4f0 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
1a500 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
1a510 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
1a520 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
1a530 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
1a540 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
1a550 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
1a560 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
1a570 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
1a580 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
1a590 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
1a5a0 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
1a5b0 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
1a5c0 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
1a5d0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
1a5e0 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
1a5f0 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
1a600 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1a610 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1a620 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
1a630 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
1a640 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
1a650 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
1a660 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
1a670 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
1a680 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
1a690 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
1a6a0 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
1a6b0 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
1a6c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1a6d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a6e0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
1a6f0 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
1a700 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
1a710 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
1a720 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1a730 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
1a740 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
1a750 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
1a760 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
1a770 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
1a780 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
1a790 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
1a7a0 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
1a7b0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
1a7c0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
1a7d0 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
1a7e0 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
1a7f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1a800 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1a810 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1a820 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1a830 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
1a840 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
1a850 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
1a860 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1a870 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
1a880 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
1a890 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
1a8a0 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
1a8b0 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
1a8c0 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
1a8d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1a8e0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
1a8f0 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
1a900 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
1a910 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
1a920 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
1a930 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1a940 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
1a950 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
1a960 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
1a970 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
1a980 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
1a990 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
1a9a0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
1a9b0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
1a9c0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1a9d0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
1a9e0 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
1a9f0 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
1aa00 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
1aa10 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
1aa20 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
1aa30 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
1aa40 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
1aa50 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1aa60 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
1aa70 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
1aa80 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
1aa90 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
1aaa0 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
1aab0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1aac0 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
1aad0 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
1aae0 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
1aaf0 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
1ab00 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
1ab10 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
1ab20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
1ab30 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
1ab40 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
1ab50 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
1ab60 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1ab70 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
1ab80 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
1ab90 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1aba0 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
1abb0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
1abc0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
1abd0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
1abe0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
1abf0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
1ac00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1ac10 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
1ac20 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
1ac30 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
1ac40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
1ac70 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
1ac80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ac90 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
1aca0 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28  3WritableSchema(
1acb0 70 42 74 2d 3e 64 62 29 3d 3d 30 20 26 26 20 6e  pBt->db)==0 && n
1acc0 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29  Page>nPageFile )
1acd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ace0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1acf0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
1ad00 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1ad10 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
1ad20 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31  DENCE-OF: R-2831
1ad30 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c  2-64704 However,
1ad40 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65   the usable size
1ad50 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
1ad60 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73  to.    ** be les
1ad70 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f  s than 480. In o
1ad80 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
1ad90 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
1ada0 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  512, then the.  
1adb0 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70    ** reserved sp
1adc0 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20  ace size cannot 
1add0 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20  exceed 32. */.  
1ade0 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
1adf0 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
1ae00 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1ae10 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1ae20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
1ae30 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
1ae40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
1ae50 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
1ae60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ae70 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
1ae80 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
1ae90 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
1aea0 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
1aeb0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
1aec0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
1aed0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
1aee0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
1aef0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
1af00 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
1af10 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
1af20 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
1af30 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
1af40 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
1af50 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
1af60 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
1af70 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
1af80 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
1af90 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
1afa0 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
1afb0 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
1afc0 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
1afd0 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
1afe0 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
1aff0 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
1b000 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
1b010 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
1b020 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
1b030 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
1b040 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
1b050 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
1b060 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
1b070 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1b080 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
1b090 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
1b0a0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
1b0b0 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
1b0c0 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
1b0d0 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
1b0e0 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
1b0f0 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
1b100 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
1b110 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
1b120 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
1b130 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
1b140 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
1b150 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
1b160 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
1b170 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
1b180 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
1b190 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1b1a0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
1b1b0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
1b1c0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
1b1d0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
1b1e0 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
1b1f0 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
1b200 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1b210 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
1b220 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
1b230 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
1b240 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1b250 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
1b260 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
1b270 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
1b280 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
1b290 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
1b2a0 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
1b2b0 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
1b2c0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
1b2d0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
1b2e0 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
1b2f0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
1b300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1b310 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1b320 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
1b330 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  One(pPage1);.  p
1b340 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
1b350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b360 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
1b370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b380 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
1b390 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54  s open on pBt. T
1b3a0 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
1b3b0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
1b3c0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
1b3d0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
1b3e0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
1b3f0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
1b400 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  *.** Only write 
1b410 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
1b420 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73  ted if wrOnly is
1b430 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c   true.  If wrOnl
1b440 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68  y is.** false th
1b450 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
1b460 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a  re counted..**.*
1b470 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
1b480 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
1b490 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20  ne, a cursor is 
1b4a0 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
1b4b0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
1b4c0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1b4d0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1b4e0 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68  ase.  Cursors th
1b4f0 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  at.** have been 
1b500 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65  tripped into the
1b510 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74   CURSOR_FAULT st
1b520 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  ate are not coun
1b530 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
1b540 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  nt countValidCur
1b550 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
1b560 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b  Bt, int wrOnly){
1b570 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1b580 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
1b590 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
1b5a0 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
1b5b0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
1b5c0 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c  {.    if( (wrOnl
1b5d0 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63  y==0 || (pCur->c
1b5e0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
1b5f0 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20  riteFlag)!=0).  
1b600 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
1b610 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
1b620 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
1b630 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
1b640 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  f../*.** If ther
1b650 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
1b660 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
1b670 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
1b680 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
1b690 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
1b6a0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
1b6b0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1b6c0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
1b6d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
1b6e0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
1b6f0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1b700 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
1b710 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
1b720 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
1b730 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
1b740 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
1b750 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1b760 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
1b770 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1b780 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1b790 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
1b7a0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
1b7b0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
1b7c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b7d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1b7e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
1b7f0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
1b800 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  t,0)==0 || pBt->
1b810 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
1b820 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
1b830 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1b840 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1b850 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
1b860 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  =0 ){.    MemPag
1b870 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1b880 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73  >pPage1;.    ass
1b890 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61  ert( pPage1->aDa
1b8a0 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
1b8b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
1b8c0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
1b8d0 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42  er)==1 );.    pB
1b8e0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1b8f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1b900 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  e(pPage1);.  }.}
1b910 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
1b920 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
1b930 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
1b940 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
1b950 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
1b960 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
1b970 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
1b980 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1b990 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
1b9a0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1b9b0 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
1b9c0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1b9d0 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
1b9e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
1b9f0 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
1ba00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ba10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1ba20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
1ba30 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
1ba40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ba50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
1ba60 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1ba70 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
1ba80 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
1ba90 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
1baa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1bab0 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
1bac0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1bad0 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
1bae0 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
1baf0 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
1bb00 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
1bb10 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
1bb20 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
1bb30 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
1bb40 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
1bb50 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
1bb60 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
1bb70 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1bb80 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
1bb90 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
1bba0 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
1bbb0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
1bbc0 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
1bbd0 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
1bbe0 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
1bbf0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
1bc00 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
1bc10 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
1bc20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
1bc30 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
1bc40 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
1bc50 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
1bc60 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
1bc70 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
1bc80 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
1bc90 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
1bca0 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
1bcb0 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
1bcc0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
1bcd0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
1bce0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bcf0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
1bd00 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
1bd10 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1bd20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
1bd30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1bd40 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
1bd50 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
1bd60 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
1bd70 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
1bd80 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
1bd90 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
1bda0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
1bdb0 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
1bdc0 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
1bdd0 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
1bde0 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
1bdf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1be00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1be10 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
1be20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1be30 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
1be40 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
1be50 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
1be60 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
1be70 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
1be80 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
1be90 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
1bea0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
1beb0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1bec0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
1bed0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
1bee0 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
1bef0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1bf00 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1bf10 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
1bf20 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
1bf30 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
1bf40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1bf50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1bf60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bf70 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
1bf80 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
1bf90 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
1bfa0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
1bfb0 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
1bfc0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1bfd0 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
1bfe0 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
1bff0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
1c000 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1c010 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
1c020 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
1c030 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
1c040 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
1c050 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
1c060 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
1c070 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
1c080 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
1c090 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
1c0a0 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
1c0b0 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
1c0c0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
1c0d0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1c0e0 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
1c0f0 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
1c100 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
1c110 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
1c120 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
1c130 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1c140 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1c150 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1c160 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
1c170 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
1c180 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
1c190 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1c1a0 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
1c1b0 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
1c1c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1c1d0 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
1c1e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
1c1f0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
1c200 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1c210 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
1c220 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
1c230 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1c240 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
1c250 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
1c260 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
1c270 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
1c280 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
1c290 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
1c2a0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1c2b0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
1c2c0 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
1c2d0 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
1c2e0 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
1c2f0 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
1c300 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
1c310 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
1c320 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
1c330 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
1c340 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
1c350 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
1c360 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
1c370 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
1c380 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1c390 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
1c3a0 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
1c3b0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
1c3c0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
1c3d0 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
1c3e0 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
1c3f0 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
1c400 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
1c410 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
1c420 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
1c430 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
1c440 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
1c450 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
1c460 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
1c470 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
1c480 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
1c490 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
1c4a0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
1c4b0 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
1c4c0 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
1c4d0 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
1c4e0 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
1c4f0 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
1c500 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
1c510 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
1c520 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
1c530 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
1c540 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
1c550 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
1c560 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
1c570 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
1c580 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
1c590 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
1c5a0 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
1c5b0 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
1c5c0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
1c5d0 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
1c5e0 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
1c5f0 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
1c600 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c610 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
1c620 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
1c630 61 67 2c 20 69 6e 74 20 2a 70 53 63 68 65 6d 61  ag, int *pSchema
1c640 56 65 72 73 69 6f 6e 29 7b 0a 20 20 42 74 53 68  Version){.  BtSh
1c650 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1c660 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
1c670 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
1c680 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1c690 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1c6a0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1c6b0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
1c6c0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
1c6d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
1c6e0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
1c6f0 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
1c700 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1c710 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1c720 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
1c730 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
1c740 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1c750 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1c760 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
1c770 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
1c780 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
1c790 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
1c7a0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
1c7b0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1c7c0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1c7d0 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
1c7e0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
1c7f0 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
1c800 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  if( (p->db->flag
1c810 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74  s & SQLITE_Reset
1c820 44 61 74 61 62 61 73 65 29 20 0a 20 20 20 26 26  Database) .   &&
1c830 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
1c840 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
1c850 67 65 72 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  ger)==0 .  ){.  
1c860 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1c870 26 3d 20 7e 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  &= ~BTS_READ_ONL
1c880 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  Y;.  }..  /* Wri
1c890 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1c8a0 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1c8b0 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1c8c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1c8d0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1c8e0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1c8f0 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1c900 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1c910 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1c920 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1c930 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1c940 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1c950 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20  D_CACHE.  {.    
1c960 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1c970 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61  = 0;.    /* If a
1c980 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1c990 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1c9a0 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1c9b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1c9c0 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68     ** on this sh
1c9d0 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1c9e0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1c9f0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1ca00 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  ion is.    ** re
1ca10 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
1ca20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
1ca30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1ca40 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1ca50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1ca60 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c  NS_WRITE).     |
1ca70 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
1ca80 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
1ca90 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1caa0 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
1cab0 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d  riter->db;.    }
1cac0 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1cad0 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63  1 ){.      BtLoc
1cae0 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20  k *pIter;.      
1caf0 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1cb00 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1cb10 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1cb20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1cb30 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
1cb40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f  {.          pBlo
1cb50 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1cb60 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1cb70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1cb80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1cb90 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20  .    if( pBlock 
1cba0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1cbb0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
1cbc0 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
1cbd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1cbe0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
1cbf0 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f  DCACHE;.      go
1cc00 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1cc10 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1cc20 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1cc30 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1cc40 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1cc50 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1cc60 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1cc70 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1cc80 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1cc90 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1cca0 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1ccb0 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1ccc0 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1ccd0 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1cce0 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1ccf0 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1cd00 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1cd10 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1cd20 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1cd30 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1cd40 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1cd50 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1cd60 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1cd70 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1cd80 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1cd90 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1cda0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1cdb0 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1cdc0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1cdd0 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1cde0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1cdf0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1ce00 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1ce10 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1ce20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1ce30 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1ce40 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1ce50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1ce60 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1ce70 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1ce80 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1ce90 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1cea0 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1ceb0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1cec0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1ced0 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1cee0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1cef0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1cf00 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1cf10 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1cf20 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1cf30 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1cf40 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1cf50 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1cf60 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1cf70 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1cf80 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1cf90 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1cfa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1cfb0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1cfc0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1cfd0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1cfe0 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1cff0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1d000 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1d010 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1d020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1d030 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
1d040 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
1d050 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
1d060 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
1d070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1d090 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1d0a0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Bt);.        }el
1d0b0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1d0c0 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20  E_BUSY_SNAPSHOT 
1d0d0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1d0e0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1d0f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  E ){.          /
1d100 2a 20 69 66 20 74 68 65 72 65 20 77 61 73 20 6e  * if there was n
1d110 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  o transaction op
1d120 65 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  ened when this f
1d130 75 6e 63 74 69 6f 6e 20 77 61 73 0a 20 20 20 20  unction was.    
1d140 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20        ** called 
1d150 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  and SQLITE_BUSY_
1d160 53 4e 41 50 53 48 4f 54 20 69 73 20 72 65 74 75  SNAPSHOT is retu
1d170 72 6e 65 64 2c 20 63 68 61 6e 67 65 20 74 68 65  rned, change the
1d180 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1d190 20 2a 2a 20 63 6f 64 65 20 74 6f 20 53 51 4c 49   ** code to SQLI
1d1a0 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 20 20  TE_BUSY. */.    
1d1b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d1c0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1d1d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1d1e0 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
1d1f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d200 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1d210 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1d220 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
1d230 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
1d240 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
1d250 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d260 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
1d270 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
1d280 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
1d290 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
1d2a0 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75 74 28  esetLockTimeout(
1d2b0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20  pBt->pPager);.. 
1d2c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d2d0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
1d2e0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d2f0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
1d300 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
1d310 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
1d320 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1d330 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
1d340 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
1d350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1d360 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
1d370 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
1d380 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
1d390 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
1d3a0 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
1d3b0 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
1d3c0 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1d3d0 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
1d3e0 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
1d3f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1d400 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
1d410 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
1d420 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
1d430 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
1d440 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
1d450 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1d460 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1d470 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
1d480 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
1d490 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
1d4a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1d4b0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1d4c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d4d0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1d4e0 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
1d4f0 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
1d500 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
1d510 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
1d520 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1d530 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
1d540 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
1d550 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
1d560 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
1d570 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
1d580 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
1d590 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
1d5a0 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
1d5b0 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
1d5c0 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
1d5d0 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
1d5e0 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
1d5f0 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
1d600 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
1d610 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
1d620 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
1d630 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
1d640 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1d650 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
1d660 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
1d670 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
1d680 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
1d690 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
1d6a0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
1d6b0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
1d6c0 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
1d6d0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1d6e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
1d6f0 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
1d700 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1d710 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
1d720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d730 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1d740 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1d750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d770 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1d780 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1d790 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1d7a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d7b0 20 7d 0a 20 20 7d 0a 0a 74 72 61 6e 73 5f 62 65   }.  }..trans_be
1d7c0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
1d7d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d7e0 69 66 28 20 70 53 63 68 65 6d 61 56 65 72 73 69  if( pSchemaVersi
1d7f0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 63  on ){.      *pSc
1d800 68 65 6d 61 56 65 72 73 69 6f 6e 20 3d 20 67 65  hemaVersion = ge
1d810 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1d820 67 65 31 2d 3e 61 44 61 74 61 5b 34 30 5d 29 3b  ge1->aData[40]);
1d830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1d840 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 2f  rflag ){.      /
1d850 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
1d860 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
1d870 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
1d880 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
1d890 20 20 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61        ** open sa
1d8a0 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
1d8b0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1d8c0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
1d8d0 6e 20 30 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  n 0 and.      **
1d8e0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1d8f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1d900 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
1d910 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
1d920 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1d930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d940 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1d950 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
1d960 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
1d970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62  ;.    }.  }..  b
1d980 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1d990 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1d9a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1d9b0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1d9c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d9d0 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
1d9e0 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
1d9f0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1da00 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
1da10 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
1da20 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
1da30 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
1da40 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1da50 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
1da60 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
1da70 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
1da80 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1da90 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
1daa0 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
1dab0 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
1dac0 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
1dad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1daf0 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
1db00 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
1db10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1db30 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
1db40 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
1db50 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1db80 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
1db90 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1dba0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
1dbb0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
1dbc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1dbd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1dbe0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1dbf0 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e  ;.  rc = pPage->
1dc00 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f  isInit ? SQLITE_
1dc10 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61  OK : btreeInitPa
1dc20 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
1dc30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dc40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43   return rc;.  nC
1dc50 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1dc60 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
1dc70 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1dc80 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1dc90 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1dca0 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
1dcb0 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
1dcc0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
1dcd0 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
1dce0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1dcf0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1dd00 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
1dd10 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
1dd20 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1dd30 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1dd40 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1dd50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1dd60 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1dd70 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1dd80 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1dd90 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1dda0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1ddb0 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
1ddc0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1ddd0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1dde0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20  no, &rc);.  }.. 
1ddf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1de00 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
1de10 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
1de20 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
1de30 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
1de40 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
1de50 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1de60 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
1de70 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
1de80 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
1de90 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
1dea0 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
1deb0 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
1dec0 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
1ded0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1dee0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1def0 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
1df00 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1df10 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
1df20 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1df30 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
1df40 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1df50 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1df60 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
1df70 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
1df80 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1df90 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
1dfa0 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
1dfb0 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
1dfc0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1dfd0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
1dfe0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
1dff0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1e000 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1e030 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
1e040 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
1e050 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
1e060 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
1e070 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
1e080 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
1e090 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1e0a0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1e0b0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1e0c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e0d0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1e0e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1e0f0 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
1e100 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1e110 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
1e120 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
1e130 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
1e140 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
1e150 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1e160 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
1e170 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1e180 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1e190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e1a0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
1e1b0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ge);.    }.    p
1e1c0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
1e1d0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
1e1e0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
1e1f0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
1e200 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
1e210 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  rc = pPage->isIn
1e220 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  it ? SQLITE_OK :
1e230 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1e240 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e250 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e260 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
1e270 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
1e280 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1e290 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
1e2a0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1e2b0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
1e2c0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1e2d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
1e2e0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
1e2f0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
1e300 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
1e310 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
1e320 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
1e330 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
1e340 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
1e350 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1e360 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cell+info.nSize 
1e370 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
1e380 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
1e390 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
1e3a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e3b0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
1e3c0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1e3d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1e3e0 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
1e3f0 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1e400 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ze-4) ){.       
1e410 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1e420 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1e430 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1e440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e460 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e470 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1e480 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
1e490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1e4a0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
1e4b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1e4c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1e4d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1e4e0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
1e4f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
1e500 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
1e510 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
1e520 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1e530 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1e540 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
1e550 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
1e560 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e570 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
1e580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1e590 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1e5a0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1e5b0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
1e5c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e5d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e5e0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
1e5f0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1e600 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
1e610 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
1e620 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
1e630 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
1e640 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
1e650 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
1e660 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
1e670 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
1e680 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
1e690 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
1e6a0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
1e6b0 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
1e6c0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
1e6d0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1e6e0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
1e6f0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
1e700 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
1e710 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
1e720 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
1e730 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
1e740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e750 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
1e760 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1e770 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
1e780 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
1e790 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
1e7a0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
1e7b0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
1e7c0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
1e7d0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1e7e0 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
1e7f0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1e800 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
1e810 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1e820 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
1e830 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1e840 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
1e850 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
1e860 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
1e870 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
1e880 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
1e890 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
1e8a0 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
1e8b0 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
1e8c0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1e8d0 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
1e8e0 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
1e8f0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
1e900 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
1e910 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
1e920 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
1e930 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
1e940 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1e950 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1e960 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1e970 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
1e980 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
1e990 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1e9a0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
1e9b0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
1e9c0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1e9d0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e9e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1e9f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ea00 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1ea10 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
1ea20 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  e->pBt==pBt );. 
1ea30 20 69 66 28 20 69 44 62 50 61 67 65 3c 33 20 29   if( iDbPage<3 )
1ea40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1ea50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
1ea60 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1ea70 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1ea80 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1ea90 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1eaa0 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1eab0 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1eac0 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1ead0 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1eae0 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1eaf0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1eb00 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1eb10 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1eb20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1eb30 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1eb40 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1eb50 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1eb60 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1eb70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1eb80 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1eb90 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1eba0 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1ebb0 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1ebc0 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1ebd0 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1ebe0 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1ebf0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1ec00 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1ec10 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1ec20 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1ec30 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1ec40 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1ec50 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1ec60 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1ec70 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1ec80 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1ec90 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1eca0 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1ecb0 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1ecc0 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1ecd0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1ece0 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1ecf0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1ed00 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1ed10 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1ed20 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1ed30 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1ed40 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1ed50 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1ed60 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1ed70 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1ed80 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1ed90 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1eda0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1edb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1edc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1edd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1ede0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1edf0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1ee00 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1ee10 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1ee20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1ee30 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1ee40 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1ee50 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1ee60 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1ee70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ee80 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ee90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1eea0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1eeb0 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1eec0 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1eed0 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1eee0 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1eef0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1ef00 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1ef10 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1ef20 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1ef30 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1ef40 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1ef50 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1ef60 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1ef70 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1ef80 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1ef90 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1efa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1efb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1efc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1efd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1efe0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1eff0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1f000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1f020 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1f030 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1f040 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1f050 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1f060 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1f070 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1f080 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1f090 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1f0a0 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1f0b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f0c0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1f0d0 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1f0e0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1f0f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1f100 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f110 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1f120 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1f130 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1f140 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1f150 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1f160 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1f170 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1f180 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1f190 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1f1a0 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1f1b0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1f1c0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1f1d0 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1f1e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1f1f0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1f200 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1f210 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1f220 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1f230 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1f240 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1f250 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1f260 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1f270 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1f280 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1f290 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1f2a0 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1f2b0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1f2c0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1f2d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1f2e0 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1f2f0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1f300 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1f310 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1f320 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1f330 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1f340 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f350 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1f360 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1f370 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1f380 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1f390 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1f3a0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1f3b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1f3c0 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1f3d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1f3e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1f3f0 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1f400 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1f410 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1f420 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1f430 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1f440 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1f450 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1f460 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1f470 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1f480 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1f490 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1f4a0 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1f4b0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1f4c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1f4d0 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1f4e0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1f4f0 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1f500 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1f510 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1f520 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1f530 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1f540 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1f550 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1f560 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1f570 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f580 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1f590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1f5a0 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1f5b0 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1f5c0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1f5d0 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1f5e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f5f0 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1f600 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1f610 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1f620 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1f630 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1f640 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1f650 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1f660 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f670 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1f680 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1f690 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1f6a0 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1f6b0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1f6c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f6d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f6e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1f6f0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1f700 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1f710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f720 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f730 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1f740 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1f750 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1f760 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1f770 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1f780 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1f790 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1f7a0 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1f7b0 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1f7c0 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1f7d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1f7e0 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1f7f0 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1f800 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1f810 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1f820 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1f830 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1f840 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1f850 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1f860 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1f870 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1f880 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1f890 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1f8a0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1f8b0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1f8c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1f8d0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1f8e0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1f8f0 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1f900 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1f910 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f920 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f930 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1f940 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1f950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1f960 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1f970 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1f980 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1f990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1f9a0 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1f9b0 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1f9c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1f9d0 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1f9e0 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1f9f0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1fa00 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1fa10 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1fa20 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1fa30 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1fa40 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1fa50 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1fa60 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1fa70 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1fa80 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1fa90 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1faa0 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1fab0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1fac0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1fad0 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1fae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1faf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1fb00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1fb10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1fb20 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1fb30 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1fb40 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1fb50 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1fb60 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1fb70 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1fb80 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1fb90 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1fba0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1fbb0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1fbc0 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1fbd0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1fbe0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1fbf0 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1fc00 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1fc10 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1fc20 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1fc30 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1fc40 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1fc50 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1fc60 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1fc70 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1fc80 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1fc90 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1fca0 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1fcb0 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1fcc0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1fcd0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1fce0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1fcf0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1fd00 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1fd10 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1fd20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1fd30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fd40 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1fd50 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1fd60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1fd70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fd80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1fd90 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1fda0 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1fdb0 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1fdc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fdd0 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1fde0 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1fdf0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1fe00 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1fe10 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1fe20 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1fe30 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1fe40 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1fe50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fe60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fe70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fe80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1fe90 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1fea0 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1feb0 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1fec0 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1fed0 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1fee0 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1fef0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1ff00 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1ff10 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1ff20 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1ff30 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1ff40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ff50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1ff60 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1ff70 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1ff80 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1ff90 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1ffa0 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1ffb0 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1ffc0 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1ffd0 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1ffe0 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1fff0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
20000 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
20010 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
20020 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
20030 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
20040 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
20050 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
20060 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
20070 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
20080 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
20090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
200a0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
200b0 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
200c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
200d0 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
200e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
200f0 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
20100 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
20110 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
20140 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
20150 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
20160 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
20170 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
20180 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
20190 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
201a0 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
201b0 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
201c0 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
201d0 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
201e0 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
201f0 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
20200 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
20210 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
20220 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
20230 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
20240 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
20250 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
20260 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
20270 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
20280 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
20290 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
202a0 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
202b0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
202c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
202d0 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
202e0 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
202f0 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
20300 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
20310 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
20320 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
20330 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
20340 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
20350 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
20360 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
20370 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
20380 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
20390 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
203a0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
203b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
203c0 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
203d0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
203e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
203f0 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
20400 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
20410 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
20420 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
20430 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20440 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
20450 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
20460 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
20470 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
20480 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
20490 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
204a0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
204b0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
204c0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
204d0 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
204e0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
204f0 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
20500 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
20510 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
20520 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
20530 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
20540 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
20550 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
20560 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
20570 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
20580 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
20590 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
205a0 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
205b0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
205c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
205d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
205e0 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
205f0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
20600 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
20610 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
20620 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
20630 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
20640 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
20650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20660 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20670 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
20680 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
20690 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
206a0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
206b0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
206c0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
206d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
206e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
206f0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
20700 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
20710 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
20720 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
20730 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
20740 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
20750 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20760 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
20770 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
20780 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
20790 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
207a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
207b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
207c0 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
207d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
207e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
207f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20800 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
20810 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
20820 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
20830 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
20840 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
20850 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
20860 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
20870 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
20880 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
20890 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
208a0 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
208b0 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
208c0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
208d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
208e0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
208f0 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
20900 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
20910 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
20920 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
20930 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20940 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
20950 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
20960 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
20970 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
20980 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
20990 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
209a0 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
209b0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
209c0 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
209d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
209e0 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
209f0 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
20a00 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
20a10 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
20a20 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
20a30 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
20a40 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
20a50 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
20a60 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
20a70 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
20a80 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
20a90 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
20aa0 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
20ab0 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
20ac0 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
20ad0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
20ae0 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
20af0 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
20b00 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
20b10 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20b20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
20b30 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
20b40 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
20b50 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
20b60 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
20b70 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
20b80 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
20b90 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
20ba0 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
20bb0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
20bc0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
20bd0 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
20be0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
20bf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20c00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20c10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
20c20 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
20c30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20c40 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
20c50 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
20c60 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
20c70 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
20c80 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
20c90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20ca0 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
20cb0 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
20cc0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
20cd0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
20ce0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
20cf0 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
20d00 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
20d10 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
20d20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
20d30 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
20d40 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
20d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20d60 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
20d70 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
20d80 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
20d90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20da0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
20db0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
20dc0 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
20dd0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
20de0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
20df0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
20e00 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
20e10 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
20e20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20e30 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20e40 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
20e50 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
20e60 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
20e70 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
20e80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
20e90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20eb0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
20ec0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
20ed0 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
20ee0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
20ef0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
20f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
20f10 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
20f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
20f30 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
20f40 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
20f50 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
20f60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
20f70 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
20f80 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
20f90 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
20fa0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
20fb0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
20fc0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20fd0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
20fe0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
20ff0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
21000 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
21010 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
21020 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
21030 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
21040 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
21050 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
21060 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
21070 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
21080 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
21090 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
210a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
210b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
210c0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
210d0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
210e0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
210f0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
21100 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
21110 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
21120 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
21130 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
21140 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
21150 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
21160 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
21170 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
21180 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
21190 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
211a0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
211b0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
211c0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
211d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
211e0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
211f0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
21200 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21210 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
21220 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
21230 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
21240 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
21250 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
21260 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
21270 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
21280 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
21290 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
212a0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
212b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
212c0 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
212d0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
212e0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
212f0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
21300 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
21310 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
21320 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
21330 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
21340 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
21350 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
21360 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
21370 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
21380 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
21390 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
213a0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
213b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
213c0 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
213d0 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
213e0 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
213f0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
21400 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
21410 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
21420 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
21430 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
21440 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
21450 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
21460 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
21470 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
21480 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
21490 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
214a0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
214b0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
214c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
214d0 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
214e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
214f0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
21500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21510 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
21520 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
21530 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
21540 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
21550 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21560 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
21570 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21580 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
21590 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
215a0 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
215b0 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
215c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
215d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
215e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
215f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
21600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21610 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
21620 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
21630 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
21640 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
21650 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
21660 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
21670 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
21680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21690 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
216a0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
216b0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
216c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
216d0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
216e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
216f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21700 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
21710 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
21720 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
21730 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
21740 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
21750 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
21760 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
21770 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
21780 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
21790 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
217a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
217b0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
217c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
217d0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
217e0 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
217f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
21800 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
21810 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
21820 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
21830 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
21840 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
21850 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
21860 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
21870 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
21880 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
21890 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
218a0 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
218b0 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
218c0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
218d0 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
218e0 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
218f0 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
21900 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
21910 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
21920 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
21930 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
21940 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
21950 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
21960 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
21970 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
21980 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
21990 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
219a0 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
219b0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
219c0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
219d0 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
219e0 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
219f0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
21a00 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
21a10 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
21a20 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
21a30 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
21a40 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
21a50 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
21a60 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
21a70 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
21a80 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
21a90 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
21aa0 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
21ab0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
21ac0 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
21ad0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
21ae0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
21af0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
21b00 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
21b10 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
21b20 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
21b30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
21b40 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
21b50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
21b60 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
21b70 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
21b80 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
21b90 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
21ba0 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
21bb0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
21bc0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
21bd0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
21be0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
21bf0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
21c00 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
21c10 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
21c20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
21c30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
21c40 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
21c50 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
21c60 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
21c70 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
21c80 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
21c90 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
21ca0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
21cb0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
21cc0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
21cd0 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
21ce0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
21cf0 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
21d00 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
21d10 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
21d20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
21d30 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
21d40 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
21d50 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
21d60 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
21d70 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
21d80 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
21d90 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
21da0 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
21db0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
21dc0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
21dd0 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
21de0 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
21df0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
21e00 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
21e10 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
21e20 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
21e30 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
21e40 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
21e50 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
21e60 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
21e70 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
21e80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
21e90 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
21ea0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
21eb0 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
21ec0 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
21ed0 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
21ee0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
21ef0 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
21f00 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
21f10 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
21f20 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
21f30 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
21f40 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
21f50 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
21f60 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
21f70 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
21f80 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
21f90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
21fa0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
21fb0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
21fc0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
21fd0 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
21fe0 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
21ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
22000 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
22010 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
22020 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
22030 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
22040 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
22050 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
22060 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
22070 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
22080 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
22090 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
220a0 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
220b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
220c0 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
220d0 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
220e0 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
220f0 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
22100 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
22110 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
22120 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
22130 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
22140 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
22150 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
22160 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
22170 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
22180 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
22190 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
221a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
221b0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
221c0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
221d0 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
221e0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
221f0 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
22200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
22210 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22220 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
22230 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
22240 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
22250 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
22260 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
22270 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
22280 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
22290 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
222a0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
222b0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
222c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
222d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
222e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
222f0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
22300 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
22310 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
22320 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
22330 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
22340 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
22350 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
22360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22370 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
22380 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
22390 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
223a0 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
223b0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
223c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
223d0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
223e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
223f0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
22400 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
22410 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
22420 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
22430 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
22440 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
22450 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
22460 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
22470 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
22480 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
22490 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
224a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
224b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
224c0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
224d0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
224e0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
224f0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
22500 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
22510 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
22520 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
22530 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
22540 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
22550 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
22560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
22570 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22580 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
22590 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
225a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
225b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
225c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
225d0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
225e0 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
225f0 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
22600 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
22610 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
22620 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
22630 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
22640 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
22650 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
22660 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
22670 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
22680 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
22690 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
226a0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
226b0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
226c0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
226d0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
226e0 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
226f0 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
22700 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
22710 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
22720 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
22730 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
22740 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
22750 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
22760 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22770 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
22780 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
22790 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
227a0 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
227b0 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
227c0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
227d0 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
227e0 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
227f0 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
22800 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
22810 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
22820 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
22830 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
22840 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
22850 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
22860 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
22870 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
22880 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
22890 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
228a0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
228b0 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
228c0 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
228d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
228e0 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
228f0 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
22900 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
22910 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
22920 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
22930 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
22940 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
22950 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
22960 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
22970 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
22980 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
22990 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
229a0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
229b0 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
229c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
229d0 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
229e0 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
229f0 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
22a00 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
22a10 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
22a20 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
22a30 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
22a40 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
22a50 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
22a60 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
22a70 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
22a80 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
22a90 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
22aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22ab0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
22ac0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
22ad0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
22ae0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
22af0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
22b00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22b10 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
22b20 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
22b30 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
22b40 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
22b50 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
22b60 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
22b70 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
22b80 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
22b90 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
22ba0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
22bb0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72  t){.      if( wr
22bc0 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63  iteOnly && (p->c
22bd0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
22be0 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a  riteFlag)==0 ){.
22bf0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
22c00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22c10 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
22c20 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
22c30 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  T ){.          r
22c40 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
22c50 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
22c60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22c70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22c80 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
22c90 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
22ca0 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72  ursors(pBtree, r
22cb0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
22cc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22cf0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
22d00 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
22d10 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
22d20 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
22d30 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b  T;.        p->sk
22d40 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
22d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22d60 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
22d70 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
22d80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22d90 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
22da0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
22db0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
22dc0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
22dd0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
22de0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
22df0 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
22e00 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
22e10 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
22e20 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
22e30 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
22e40 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
22e50 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
22e60 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
22e70 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
22e80 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
22e90 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
22ea0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
22eb0 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
22ec0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
22ed0 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
22ee0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
22ef0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
22f00 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
22f10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
22f20 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
22f30 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
22f40 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
22f50 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
22f60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22f70 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
22f80 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
22f90 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
22fa0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
22fb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
22fc0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
22fd0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
22fe0 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
22ff0 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
23000 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
23010 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
23020 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
23030 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
23040 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
23050 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23060 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
23070 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
23080 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
23090 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
230a0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
230b0 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
230c0 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
230d0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
230e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
230f0 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
23100 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
23110 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
23120 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
23130 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
23140 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
23150 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
23160 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
23170 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
23180 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
23190 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
231a0 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
231b0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
231c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
231d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
231e0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
231f0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
23200 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
23210 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
23220 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
23230 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
23240 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
23250 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
23260 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
23270 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
23280 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
23290 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
232a0 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
232b0 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
232c0 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
232d0 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
232e0 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
232f0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
23300 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
23310 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
23320 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
23330 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
23340 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
23350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
23360 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
23370 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
23380 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
23390 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
233a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
233b0 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
233c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
233d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
233e0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
233f0 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
23400 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
23410 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
23420 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
23430 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
23440 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
23450 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
23460 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
23470 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
23480 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
23490 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
234a0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
234b0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
234c0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
234d0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
234e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
234f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23500 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
23510 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
23520 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
23530 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
23540 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
23550 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
23560 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
23570 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
23580 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
23590 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
235a0 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
235b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
235c0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
235d0 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
235e0 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
235f0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
23600 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
23610 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
23620 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
23630 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
23640 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
23650 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
23660 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
23670 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
23680 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
23690 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
236a0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
236b0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
236c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
236d0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
236e0 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
236f0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
23700 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
23710 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
23720 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
23730 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
23740 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
23750 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
23760 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
23770 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
23780 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
23790 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
237a0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
237b0 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
237c0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
237d0 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
237e0 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
237f0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
23800 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
23810 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
23820 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
23830 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
23840 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
23850 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
23860 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
23870 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
23880 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
23890 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
238a0 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
238b0 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
238c0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
238d0 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
238e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
238f0 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
23900 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
23910 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
23920 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
23930 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
23940 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
23950 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
23960 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23970 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
23980 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
23990 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
239a0 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
239b0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
239c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
239d0 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
239e0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
239f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
23a00 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
23a10 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
23a20 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
23a30 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
23a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
23a50 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
23a60 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
23a70 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
23a80 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
23a90 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
23aa0 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
23ab0 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
23ac0 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
23ad0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
23ae0 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
23af0 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
23b00 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
23b10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
23b20 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
23b30 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
23b40 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
23b50 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
23b60 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
23b70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
23b80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
23b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23ba0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
23bb0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
23bc0 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
23bd0 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
23be0 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
23bf0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
23c00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
23c10 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
23c20 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
23c30 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
23c40 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
23c50 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
23c60 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
23c70 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
23c80 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
23c90 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
23ca0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
23cb0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
23cc0 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
23cd0 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
23ce0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
23cf0 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
23d00 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
23d10 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
23d20 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
23d30 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
23d40 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
23d50 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
23d60 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
23d70 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
23d80 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
23d90 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
23da0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
23db0 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
23dc0 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
23dd0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
23de0 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
23df0 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
23e00 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
23e10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23e20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
23e30 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
23e40 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
23e50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
23e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
23e70 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
23e80 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
23e90 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
23ea0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
23eb0 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
23ec0 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
23ed0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
23ee0 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
23ef0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
23f00 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  (p);.    if( op=
23f10 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
23f20 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ACK ){.      rc 
23f30 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
23f40 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
23f50 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23f60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23f70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23f80 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
23f90 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
23fa0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
23fb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23fc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23fd0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
23fe0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
23ff0 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
24000 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
24010 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
24020 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
24030 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
24040 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
24050 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
24060 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
24070 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
24080 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
24090 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
240a0 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
240b0 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
240c0 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
240d0 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
240e0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
240f0 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
24100 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
24110 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
24120 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
24130 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
24140 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
24150 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24160 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
24170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
24190 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
241a0 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
241b0 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
241c0 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
241d0 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
241e0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
241f0 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
24200 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
24210 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
24220 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
24230 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
24240 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
24250 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
24260 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
24270 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
24280 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
24290 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
242a0 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
242b0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
242c0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
242d0 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
242e0 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63  t of wrFlag is c
242f0 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63  lear, then the c
24300 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a  ursor can only.*
24310 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  * be used for re
24320 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42  ading.  If the B
24330 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 69  TREE_WRCSR bit i
24340 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
24350 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65  cursor.** can be
24360 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
24370 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67  g or for writing
24380 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
24390 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
243a0 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  .** are also met
243b0 2e 20 20 54 68 65 73 65 20 61 72 65 20 74 68 65  .  These are the
243c0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
243d0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
243e0 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69  order.** for wri
243f0 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77  ting to be allow
24400 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
24410 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
24420 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
24430 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61  ith wrFlag conta
24440 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53  ining BTREE_WRCS
24450 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  R.**.** 2:  Othe
24460 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
24470 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
24480 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
24490 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
244a0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
244b0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
244c0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
244d0 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
244e0 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
244f0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
24500 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
24510 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
24520 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
24530 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
24540 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
24550 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
24560 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
24570 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
24580 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
24590 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
245a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
245b0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
245c0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
245d0 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
245e0 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
245f0 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
24600 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
24610 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45   BTREE_FORDELETE
24620 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d   bit of wrFlag m
24630 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65  ay optionally be
24640 20 73 65 74 20 69 66 20 42 54 52 45 45 5f 57 52   set if BTREE_WR
24650 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20  CSR.** is set.  
24660 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20  If FORDELETE is 
24670 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20 68  set, that is a h
24680 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
24690 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a  mentation that.*
246a0 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 69  * this cursor wi
246b0 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ll only be used 
246c0 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64  to seek to and d
246d0 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66  elete entries of
246e0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20   an index.** as 
246f0 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72  part of a larger
24700 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
24710 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54  t.  The FORDELET
24720 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73  E hint is not us
24730 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d  ed by.** this im
24740 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42  plementation.  B
24750 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74  ut in a hypothet
24760 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65  ical alternative
24770 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20   storage engine 
24780 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64  .** in which ind
24790 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ex entries are a
247a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
247b0 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73  eted when corres
247c0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a  ponding table.**
247d0 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65   rows are delete
247e0 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45  d, the FORDELETE
247f0 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20   flag is a hint 
24800 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e  that all SEEK an
24810 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72  d DELETE.** oper
24820 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63  ations on this c
24830 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d  ursor can be no-
24840 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44  ops and all READ
24850 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20   operations can 
24860 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c  .** return a nul
24870 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20  l row (2-bytes: 
24880 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a  0x01 0x00)..**.*
24890 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
248a0 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
248b0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
248c0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
248d0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
248e0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
248f0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
24900 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
24910 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
24920 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
24930 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
24940 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
24950 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
24960 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63  ero() has been c
24970 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72  alled.** on pCur
24980 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
24990 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
249a0 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
249b0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
249c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
249d0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
249e0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a00 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
24a10 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
24a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a40 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
24a50 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
24a60 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
24a90 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
24aa0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
24ab0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ad0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
24ae0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
24af0 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
24b00 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b20 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
24b30 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74  ursor */.){.  Bt
24b40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
24b50 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
24b60 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
24b70 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
24b80 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20    BtCursor *pX; 
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
24bb0 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61  ing over other a
24bc0 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20  ll cursors */.. 
24bd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24be0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
24bf0 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
24c00 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20  wrFlag==0 .     
24c10 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52    || wrFlag==BTR
24c20 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20  EE_WRCSR .      
24c30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52   || wrFlag==(BTR
24c40 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46  EE_WRCSR|BTREE_F
24c50 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a  ORDELETE) .  );.
24c60 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
24c70 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
24c80 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
24c90 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
24ca0 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
24cb0 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
24cc0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
24cd0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
24ce0 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
24cf0 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
24d00 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
24d10 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
24d20 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
24d30 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
24d40 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
24d50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
24d60 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
24d70 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
24d80 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72  pKeyInfo!=0, (wr
24d90 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20  Flag?2:1)) );.  
24da0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
24db0 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
24dc0 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
24dd0 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
24de0 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
24df0 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
24e00 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
24e10 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
24e20 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
24e30 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
24e40 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
24e50 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
24e60 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
24e70 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
24e80 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
24e90 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
24ea0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
24eb0 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 || (pBt->btsFl
24ec0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
24ed0 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  NLY)==0 );..  if
24ee0 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrFlag ){.    
24ef0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
24f00 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  e(pBt);.    if( 
24f10 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d  pBt->pTmpSpace==
24f20 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
24f30 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
24f40 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
24f50 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
24f60 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
24f70 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61     assert( wrFla
24f80 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62  g==0 );.    iTab
24f90 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
24fa0 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
24fb0 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
24fc0 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
24fd0 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
24fe0 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
24ff0 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
25000 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
25010 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
25020 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
25030 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
25040 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
25050 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
25060 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
25070 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
25080 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
25090 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
250a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
250b0 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72  wrFlag ? BTCF_Wr
250c0 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70  iteFlag : 0;.  p
250d0 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
250e0 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20  gs = wrFlag ? 0 
250f0 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  : PAGER_GET_READ
25100 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68  ONLY;.  /* If th
25110 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
25120 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ore cursors on t
25130 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74  he same btree, t
25140 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a  hen all such.  *
25150 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a  * cursors *must*
25160 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d   have the BTCF_M
25170 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
25180 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42  . */.  for(pX=pB
25190 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20  t->pCursor; pX; 
251a0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
251b0 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52     if( pX->pgnoR
251c0 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c  oot==(Pgno)iTabl
251d0 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63  e ){.      pX->c
251e0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
251f0 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20  Multiple;.      
25200 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
25210 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
25220 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
25230 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
25240 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e  pCursor;.  pBt->
25250 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
25260 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
25270 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
25280 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25290 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
252a0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
252b0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
252e0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
252f0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
25320 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
25330 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
25340 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
25370 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
25380 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
25390 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
253a0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
253b0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
253c0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
253d0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
253e0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
25410 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
25420 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
25430 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20   iTable<1 ){.   
25440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25450 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
25460 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  se{.    sqlite3B
25470 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
25480 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
25490 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
254a0 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
254b0 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  pCur);.    sqlit
254c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
254d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
254e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
254f0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
25500 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
25510 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
25520 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
25530 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
25540 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
25550 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
25560 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
25570 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
25580 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
25590 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
255a0 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
255b0 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
255c0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
255d0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
255e0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
255f0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
25600 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25610 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
25620 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
25630 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
25640 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
25650 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
25660 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
25670 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
25680 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
25690 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
256a0 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
256b0 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
256c0 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
256d0 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
256e0 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
256f0 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
25700 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
25710 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
25720 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
25730 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
25740 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
25750 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
25760 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
25770 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
25780 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
25790 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
257a0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
257b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
257c0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
257d0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
257e0 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
257f0 2c 20 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54  , BTCURSOR_FIRST
25800 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a  _UNINIT));.}../*
25810 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
25820 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
25830 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
25840 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
25850 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
25860 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
25870 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
25880 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
25890 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
258a0 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
258b0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
258c0 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
258d0 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ree ){.    BtSha
258e0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
258f0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
25900 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
25910 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ee);.    assert(
25920 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30   pBt->pCursor!=0
25930 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   );.    if( pBt-
25940 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29  >pCursor==pCur )
25950 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
25960 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
25970 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
25980 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70       BtCursor *p
25990 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72  Prev = pBt->pCur
259a0 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  sor;.      do{. 
259b0 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
259c0 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b  ->pNext==pCur ){
259d0 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76  .          pPrev
259e0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
259f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
25a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
25a10 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  }.        pPrev 
25a20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a  = pPrev->pNext;.
25a30 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c        }while( AL
25a40 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20  WAYS(pPrev) );. 
25a50 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65     }.    btreeRe
25a60 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
25a70 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75  ges(pCur);.    u
25a80 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
25a90 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
25aa0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
25ab0 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
25ac0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
25ad0 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71  r->pKey);.    sq
25ae0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
25af0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 43 75  pBtree);.    pCu
25b00 72 2d 3e 70 42 74 72 65 65 20 3d 20 30 3b 0a 20  r->pBtree = 0;. 
25b10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
25b20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25b30 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
25b40 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
25b50 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
25b60 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
25b70 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
25b80 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
25b90 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
25ba0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
25bb0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
25bc0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
25bd0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
25be0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
25bf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
25c00 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
25c10 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
25c20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
25c30 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
25c40 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
25c50 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ell()..*/.#ifnde
25c60 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
25c70 63 20 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71  c int cellInfoEq
25c80 75 61 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c  ual(CellInfo *a,
25c90 20 43 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20   CellInfo *b){. 
25ca0 20 20 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d     if( a->nKey!=
25cb0 62 2d 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e  b->nKey ) return
25cc0 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70   0;.    if( a->p
25cd0 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79  Payload!=b->pPay
25ce0 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b  load ) return 0;
25cf0 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79  .    if( a->nPay
25d00 6c 6f 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61  load!=b->nPayloa
25d10 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
25d20 20 20 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21    if( a->nLocal!
25d30 3d 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74  =b->nLocal ) ret
25d40 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
25d50 2d 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a  ->nSize!=b->nSiz
25d60 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
25d70 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
25d80 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
25d90 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
25da0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25db0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
25dc0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
25dd0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
25de0 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
25df0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
25e00 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26  age, pCur->ix, &
25e10 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
25e20 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
25e30 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26   cellInfoEqual(&
25e40 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
25e50 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  o) );.  }.#else.
25e60 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
25e70 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
25e80 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  if.static SQLITE
25e90 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67  _NOINLINE void g
25ea0 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
25eb0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
25ec0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
25ed0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ze==0 ){.    pCu
25ee0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
25ef0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
25f00 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
25f10 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43  l(pCur->pPage,pC
25f20 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e  ur->ix,&pCur->in
25f30 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
25f40 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
25f50 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  (pCur);.  }.}..#
25f60 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
25f70 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
25f80 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
25f90 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
25fa0 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
25fb0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
25fc0 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
25fd0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
25fe0 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
25ff0 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
26000 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
26010 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
26020 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
26030 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
26040 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
26050 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
26060 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
26070 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
26080 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
26090 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
260a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
260b0 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
260c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
260d0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
260e0 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
260f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
26100 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
26110 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  NN(BtCursor *pCu
26120 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43  r){.  assert( pC
26130 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  ur!=0 );.  retur
26140 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  n pCur->eState==
26150 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
26160 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
26170 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
26180 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72  nteger key or "r
26190 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c  owid" for a tabl
261a0 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73  e btree..** This
261b0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
261c0 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72   valid for a cur
261d0 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
261e0 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f  ting into a.** o
261f0 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74  rdinary table bt
26200 72 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ree.  If the cur
26210 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  sor points to an
26220 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a   index btree or.
26230 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74  ** is invalid, t
26240 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69  he result of thi
26250 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64  s routine is und
26260 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73  efined..*/.i64 s
26270 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
26280 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  erKey(BtCursor *
26290 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
262a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
262b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
262c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
262d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
262e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
262f0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
26300 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
26310 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
26320 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d  ur->info.nKey;.}
26330 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26340 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
26350 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74  L_FUNC./*.** Ret
26360 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69  urn the offset i
26370 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
26380 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74   file for the st
26390 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  art of the.** pa
263a0 79 6c 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74  yload to which t
263b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
263c0 6e 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71  nting..*/.i64 sq
263d0 6c 69 74 65 33 42 74 72 65 65 4f 66 66 73 65 74  lite3BtreeOffset
263e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
263f0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
26400 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26410 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
26420 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26430 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26440 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
26450 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34  );.  return (i64
26460 29 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65  )pCur->pBt->page
26470 53 69 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d  Size*((i64)pCur-
26480 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31  >pPage->pgno - 1
26490 29 20 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36  ) +.         (i6
264a0 34 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  4)(pCur->info.pP
264b0 61 79 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70  ayload - pCur->p
264c0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a  Page->aData);.}.
264d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
264e0 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
264f0 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a  QL_FUNC */../*.*
26500 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
26510 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
26520 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20  payload for the 
26530 65 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20  entry that pCur 
26540 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
26550 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f  pointing to.  Fo
26560 72 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20  r table btrees, 
26570 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
26580 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61   amount.** of da
26590 74 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62  ta.  For index b
265a0 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c  trees, this will
265b0 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20   be the size of 
265c0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
265d0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67  he caller must g
265e0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
265f0 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
26600 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  ting to a non-NU
26610 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72  LL.** valid entr
26620 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
26630 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ds, the calling 
26640 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67  procedure must g
26650 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74  uarantee.** that
26660 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
26670 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43  Cursor.eState==C
26680 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a  URSOR_VALID..*/.
26690 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
266a0 50 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75  PayloadSize(BtCu
266b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
266c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
266d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
266e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
266f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26700 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65  VALID );.  getCe
26710 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
26720 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
26730 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f  o.nPayload;.}../
26740 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 75  *.** Return an u
26750 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
26760 65 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 72 65  e size of any re
26770 63 6f 72 64 20 66 6f 72 20 74 68 65 20 74 61 62  cord for the tab
26780 6c 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  le.** that the c
26790 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
267a0 67 20 69 6e 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  g into..**.** Th
267b0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
267c0 61 74 69 6f 6e 2e 20 20 45 76 65 72 79 74 68 69  ation.  Everythi
267d0 6e 67 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  ng will still wo
267e0 72 6b 20 69 66 20 74 68 69 73 0a 2a 2a 20 72 6f  rk if this.** ro
267f0 75 74 69 6e 65 20 61 6c 77 61 79 73 20 72 65 74  utine always ret
26800 75 72 6e 73 20 32 31 34 37 34 38 33 36 34 37 20  urns 2147483647 
26810 28 77 68 69 63 68 20 69 73 20 74 68 65 20 6c 61  (which is the la
26820 72 67 65 73 74 20 72 65 63 6f 72 64 0a 2a 2a 20  rgest record.** 
26830 74 68 61 74 20 53 51 4c 69 74 65 20 63 61 6e 20  that SQLite can 
26840 68 61 6e 64 6c 65 29 20 6f 72 20 6d 6f 72 65 2e  handle) or more.
26850 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 20    But returning 
26860 61 20 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65 20  a smaller value 
26870 6d 69 67 68 74 0a 2a 2a 20 70 72 65 76 65 6e 74  might.** prevent
26880 20 6c 61 72 67 65 20 6d 65 6d 6f 72 79 20 61 6c   large memory al
26890 6c 6f 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 74  locations when t
268a0 72 79 69 6e 67 20 74 6f 20 69 6e 74 65 72 70 72  rying to interpr
268b0 65 74 20 61 0a 2a 2a 20 63 6f 72 72 75 70 74 20  et a.** corrupt 
268c0 64 61 74 72 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a  datrabase..**.**
268d0 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
268e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 65 72 65  lementation mere
268f0 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  ly returns the s
26900 69 7a 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72  ize of the under
26910 6c 79 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  lying.** databas
26920 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e file..*/.sqlit
26930 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
26940 42 74 72 65 65 4d 61 78 52 65 63 6f 72 64 53 69  BtreeMaxRecordSi
26950 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
26960 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
26970 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26980 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
26990 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
269a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
269b0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70    return pCur->p
269c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28  Bt->pageSize * (
269d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 43  sqlite3_int64)pC
269e0 75 72 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  ur->pBt->nPage;.
269f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
26a00 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
26a10 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
26a20 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
26a30 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
26a40 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
26a50 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
26a60 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
26a70 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
26a80 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
26a90 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
26aa0 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
26ab0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
26ac0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
26ad0 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
26ae0 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
26af0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
26b00 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
26b10 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
26b20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
26b30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
26b40 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
26b50 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
26b60 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
26b70 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
26b80 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
26b90 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
26ba0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
26bb0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
26bc0 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
26bd0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
26be0 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
26bf0 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
26c00 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
26c10 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
26c20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
26c30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
26c40 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
26c50 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
26c60 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
26c70 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
26c80 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
26c90 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
26ca0 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
26cb0 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
26cc0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
26cd0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
26ce0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
26cf0 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
26d00 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
26d10 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
26d20 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
26d30 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
26d40 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
26d50 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
26d60 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
26d70 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
26d80 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
26d90 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
26da0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
26db0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
26dc0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
26dd0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26de0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
26df0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
26e00 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
26e10 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
26e20 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
26e30 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
26e40 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
26e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26e60 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
26e70 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
26e80 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
26e90 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
26ea0 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
26eb0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
26ec0 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
26ed0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
26ee0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
26ef0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26f00 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
26f10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
26f20 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
26f30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
26f40 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
26f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26f60 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
26f70 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
26f80 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
26f90 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
26fa0 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
26fb0 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
26fc0 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
26fd0 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
26fe0 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
26ff0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
27000 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
27010 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
27020 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
27030 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
27040 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
27050 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
27060 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
27070 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
27080 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
27090 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
270a0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
270b0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
270c0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
270d0 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
270e0 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
270f0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
27100 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
27110 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
27120 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
27130 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
27140 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
27150 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
27160 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
27170 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
27180 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
27190 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
271a0 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
271b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
271c0 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
271d0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
271e0 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
271f0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
27200 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
27210 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
27220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27230 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
27240 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
27250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
27260 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
27270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
27280 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
27290 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
272a0 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
272b0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
272c0 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
272d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
272e0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
272f0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
27300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27310 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
27320 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
27330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
27340 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
27350 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
27360 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
27370 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
27380 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
27390 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
273a0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
273b0 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
273c0 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
273d0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
273e0 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
273f0 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
27400 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
27410 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
27420 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
27430 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
27440 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
27450 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
27460 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
27470 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
27480 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
27490 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
274a0 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
274b0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
274c0 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
274d0 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
274e0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
274f0 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
27500 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
27510 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
27520 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
27530 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
27540 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
27550 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
27560 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
27570 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
27580 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
27590 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
275a0 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
275b0 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
275c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
275d0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
275e0 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
275f0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
27600 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
27610 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
27620 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
27630 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27640 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
27650 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27670 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
27680 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
27690 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
276a0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
276b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
276c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
276d0 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
276e0 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
276f0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
27700 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
27710 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
27720 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
27730 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27740 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
27750 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
27770 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
27780 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
27790 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
277a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
277b0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
277c0 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
277d0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
277e0 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
277f0 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
27800 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
27810 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27820 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
27830 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
27840 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
27850 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
27860 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
27870 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
27880 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
27890 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
278a0 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
278b0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
278c0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
278d0 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
278e0 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
278f0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
27900 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
27910 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
27920 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
27930 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
27940 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
27950 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
27960 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
27970 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
27980 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
27990 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
279a0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
279b0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
279c0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
279d0 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
279e0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
279f0 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
27a00 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
27a10 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
27a20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
27a30 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
27a40 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
27a50 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
27a60 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
27a70 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68  flow pages.** th
27a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
27a90 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
27aa0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
27ab0 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76  pulate.** the ov
27ac0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27ad0 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
27ae0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
27af0 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
27b00 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
27b10 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
27b20 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
27b30 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
27b40 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
27b50 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
27b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
27b70 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
27b80 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
27b90 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
27ba0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
27bb0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
27bc0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
27bd0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
27be0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
27bf0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
27c00 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
27c10 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
27c20 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
27c30 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
27c40 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
27c50 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
27c60 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
27c70 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
27c80 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
27c90 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
27ca0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
27cb0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
27cc0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
27cd0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
27ce0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
27cf0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
27d00 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
27d10 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
27d20 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
27d30 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
27d40 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
27d50 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
27d60 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
27d70 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
27d80 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
27d90 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
27da0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
27db0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
27dc0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
27dd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
27de0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
27df0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
27e00 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
27e10 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
27e20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
27e30 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
27e40 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
27e50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
27e60 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
27e70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27e80 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
27e90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
27ea0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20   pCur->pPage;   
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
27ec0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
27ed0 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
27ee0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
27ef0 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
27f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
27f10 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
27f20 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
27f30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
27f40 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
27f50 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
27f60 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
27f70 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20  art = pBuf;     
27f80 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67  /* Start of orig
27f90 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20  inal out buffer 
27fa0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
27fb0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
27fc0 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c  assert( eOp==0 |
27fd0 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73  | eOp==1 );.  as
27fe0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27ff0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28010 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
28020 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
28030 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28040 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65  x(pCur) );..  ge
28050 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
28060 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
28070 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
28080 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  d;.  assert( off
28090 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
280a0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
280b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61  ;..  assert( aPa
280c0 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61  yload > pPage->a
280d0 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75  Data );.  if( (u
280e0 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20  ptr)(aPayload - 
280f0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20  pPage->aData) > 
28100 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
28110 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   - pCur->info.nL
28120 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
28130 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
28140 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
28150 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
28160 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   is an error.  T
28170 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  he.    ** condit
28180 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72  ional above is r
28190 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20  eally:.    **   
281a0 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
281b0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
281c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
281d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
281e0 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63     ** but is rec
281f0 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72  ast into its cur
28200 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f  rent form to avo
28210 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  id integer overf
28220 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20  low problems.   
28230 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
28240 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
28250 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  GE(pPage);.  }..
28260 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
28270 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
28280 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
28290 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
282a0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
282b0 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
282c0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
282d0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
282e0 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
282f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
28300 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
28310 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
28320 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
28330 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
28340 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
28350 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
28360 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
28370 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
28380 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
28390 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
283a0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
283b0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
283c0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
283d0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
283e0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
283f0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
28400 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
28410 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
28420 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
28430 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
28440 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
28450 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
28460 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
28470 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
28480 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
28490 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
284a0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
284b0 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
284c0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
284d0 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
284e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
284f0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
28500 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
28510 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
28520 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
28530 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
28540 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
28550 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
28560 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
28570 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
28580 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
28590 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
285a0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
285b0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
285c0 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
285d0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
285e0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
285f0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
28600 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28610 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
28620 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
28630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
28640 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
28650 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
28660 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
28670 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
28680 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
28690 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
286a0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f  ==0.       || nO
286b0 76 66 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28  vfl*(int)sizeof(
286c0 50 67 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d  Pgno) > sqlite3M
286d0 61 6c 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e  allocSize(pCur->
286e0 61 4f 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20  aOverflow).     
286f0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
28700 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29   *aNew = (Pgno*)
28710 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a  sqlite3Realloc(.
28720 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
28730 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76  ->aOverflow, nOv
28740 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  fl*2*sizeof(Pgno
28750 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
28760 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
28770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
28780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28790 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
287a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
287b0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
287c0 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
287d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
287e0 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f   memset(pCur->aO
287f0 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66  verflow, 0, nOvf
28800 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b  l*sizeof(Pgno));
28810 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
28820 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
28830 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c  lidOvfl;.    }el
28840 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
28850 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
28860 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
28870 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
28880 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
28890 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
288a0 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76  irst required ov
288b0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76  erflow page is v
288c0 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20  alid, skip.     
288d0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
288e0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
288f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
28900 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
28910 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
28920 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
28930 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
28940 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
28950 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
28960 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f  iIdx];.        o
28970 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
28980 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
28990 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
289a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
289b0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a  _OK && amt>0 );.
289c0 20 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50      while( nextP
289d0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  age ){.      /* 
289e0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
289f0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
28a00 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
28a10 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  he. */.      ass
28a20 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72  ert( pCur->aOver
28a30 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20  flow[iIdx]==0.  
28a40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
28a50 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28a60 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20  Idx]==nextPage. 
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
28a80 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
28a90 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
28aa0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
28ab0 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28  Page;..      if(
28ac0 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
28ad0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
28ae0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
28af0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
28b00 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
28b10 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
28b20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
28b30 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
28b40 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
28b50 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
28b60 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
28b70 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
28b80 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
28b90 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
28ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
28bb0 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
28bc0 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
28bd0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
28be0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
28bf0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
28c00 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28c10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28c20 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
28c30 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a  CF_ValidOvfl );.
28c40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28c50 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
28c60 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20  ==pBt->db );.   
28c70 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
28c80 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
28c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
28ca0 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
28cb0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
28cc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28cd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28ce0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
28cf0 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
28d00 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
28d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28d20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
28d30 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
28d40 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
28d50 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
28d60 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
28d70 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
28d80 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28d90 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
28da0 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
28db0 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
28dc0 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
28dd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28de0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
28df0 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
28e00 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
28e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
28e20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
28e30 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
28e40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
28e50 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
28e60 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
28e70 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
28e80 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
28e90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28ea0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
28eb0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
28ec0 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
28ed0 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
28ee0 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
28ef0 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
28f00 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
28f10 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
28f20 29 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  ) there are no d
28f30 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
28f40 65 20 70 61 67 65 2d 63 61 63 68 65 0a 20 20 20  e page-cache.   
28f50 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65       **   4) the
28f60 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
28f70 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
28f80 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68        **   5) th
28f90 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
28fa0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20   the WAL file.  
28fb0 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74        **   6) at
28fc0 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
28fd0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
28fe0 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
28ff0 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
29000 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29010 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
29020 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
29030 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
29040 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
29050 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
29060 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
29070 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
29080 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
29090 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
290a0 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
290b0 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
290c0 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
290d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
290e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
290f0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20      if( eOp==0  
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
29130 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
29140 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
29180 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
29190 33 50 61 67 65 72 44 69 72 65 63 74 52 65 61 64  3PagerDirectRead
291a0 4f 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  Ok(pBt->pPager, 
291b0 6e 65 78 74 50 61 67 65 29 20 20 20 20 2f 2a 20  nextPage)    /* 
291c0 28 33 2c 34 2c 35 29 20 2a 2f 0a 20 20 20 20 20  (3,4,5) */.     
291d0 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d      && &pBuf[-4]
291e0 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20  >=pBufStart     
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29            /* (6)
29210 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
29220 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29230 5f 66 69 6c 65 20 2a 66 64 20 3d 20 73 71 6c 69  _file *fd = sqli
29240 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
29250 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
29260 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
29270 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
29280 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
29290 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  4];.          as
292a0 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42  sert( aWrite>=pB
292b0 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20  ufStart );      
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292d0 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29     /* due to (6)
292e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
292f0 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69  mcpy(aSave, aWri
29300 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  te, 4);.        
29310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29320 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c  Read(fd, aWrite,
29330 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e   a+4, (i64)pBt->
29340 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61  pageSize*(nextPa
29350 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ge-1));.        
29360 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
29370 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20  4byte(aWrite);. 
29380 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29390 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34  aWrite, aSave, 4
293a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
293b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
293c0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50   {.          DbP
293d0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
293e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
293f0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
29400 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
29410 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20  ge, &pDbPage,.  
29420 20 20 20 20 20 20 20 20 20 20 20 20 28 65 4f 70              (eOp
29430 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
29440 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
29450 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29460 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29480 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
29490 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
294a0 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
294b0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
294c0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
294d0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
294e0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
294f0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
29500 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
29510 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
29520 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
29530 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29540 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
29550 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
29560 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
29570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29580 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
29590 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29      if( amt==0 )
295a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
295b0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
295c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
295d0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
295e0 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d     iIdx++;.    }
295f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
29600 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
29610 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  >0 ){.    /* Ove
29620 72 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73  rflow chain ends
29630 20 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a   prematurely */.
29640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29650 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
29660 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
29670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29680 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
29690 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68  e payload for th
296a0 65 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74  e row at which t
296b0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
296c0 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
296d0 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22  pointing.  "amt"
296e0 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
296f0 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20  ransferred into 
29700 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
29710 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
29720 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
29730 2a 2a 20 70 43 75 72 20 63 61 6e 20 62 65 20 70  ** pCur can be p
29740 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65  ointing to eithe
29750 72 20 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20  r a table or an 
29760 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a  index b-tree..**
29770 20 49 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   If pointing to 
29780 61 20 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74  a table btree, t
29790 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
297a0 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
297b0 20 20 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20    If.** pCur is 
297c0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69  pointing to an i
297d0 6e 64 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e  ndex b-tree then
297e0 20 74 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e   the key section
297f0 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
29800 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
29810 50 61 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63  Payload(), the c
29820 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
29830 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
29840 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
29850 76 61 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65  valid row in the
29860 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c   table.  For sql
29870 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
29880 43 68 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a  Checked(), the.*
29890 2a 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62  * cursor might b
298a0 65 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67  e invalid or mig
298b0 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ht need to be re
298c0 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65  stored before be
298d0 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ing read..**.** 
298e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
298f0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
29900 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
29910 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
29920 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
29930 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
29940 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
29950 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
29960 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
29970 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
29980 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
29990 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
299a0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
299b0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
299c0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
299d0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
299e0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
299f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29a00 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
29a10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29a20 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
29a30 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
29a40 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43  ert( pCur->ix<pC
29a50 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
29a60 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
29a70 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
29a80 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
29a90 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
29aa0 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
29ab0 20 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66   This variant of
29ac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
29ad0 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65  load() works eve
29ae0 6e 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  n if the cursor 
29af0 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68  has not.** in th
29b00 65 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73  e CURSOR_VALID s
29b10 74 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c  tate.  It is onl
29b20 79 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71  y used by the sq
29b30 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
29b40 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
29b50 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
29b60 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
29b70 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
29b80 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73  INLINE int acces
29b90 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
29ba0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
29bb0 72 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  r,.  u32 offset,
29bc0 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f  .  u32 amt,.  vo
29bd0 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e  id *pBuf.){.  in
29be0 74 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75  t rc;.  if ( pCu
29bf0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29c00 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
29c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
29c20 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BORT;.  }.  asse
29c30 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
29c40 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
29c50 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74    rc = btreeRest
29c60 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
29c70 6e 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  n(pCur);.  retur
29c80 6e 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65  n rc ? rc : acce
29c90 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
29ca0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
29cb0 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  f, 0);.}.int sql
29cc0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
29cd0 43 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72  Checked(BtCursor
29ce0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
29cf0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
29d00 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20  d *pBuf){.  if( 
29d10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29d20 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
29d30 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29d40 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29d50 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r) );.    return
29d60 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
29d70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
29d80 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65  , pBuf, 0);.  }e
29d90 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
29da0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65  accessPayloadChe
29db0 63 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65  cked(pCur, offse
29dc0 74 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20  t, amt, pBuf);. 
29dd0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
29de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
29df0 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  LOB */../*.** Re
29e00 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
29e10 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
29e20 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
29e30 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
29e40 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
29e50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
29e60 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
29e70 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
29e80 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
29e90 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
29ea0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
29eb0 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
29ec0 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
29ed0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
29ee0 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
29ef0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
29f00 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
29f10 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
29f20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
29f30 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
29f40 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
29f50 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
29f60 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
29f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
29f80 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
29f90 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
29fa0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
29fb0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
29fc0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
29fd0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
29fe0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
29ff0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
2a000 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
2a010 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
2a020 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
2a030 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
2a040 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
2a050 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
2a060 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
2a070 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
2a080 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
2a090 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
2a0a0 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
2a0b0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
2a0c0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
2a0d0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
2a0e0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
2a0f0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
2a100 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
2a110 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
2a120 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
2a130 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
2a140 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
2a150 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
2a160 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
2a170 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
2a180 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
2a190 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
2a1a0 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
2a1b0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
2a1c0 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
2a1d0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
2a1e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2a1f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
2a200 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
2a210 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
2a220 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
2a230 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2a240 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
2a250 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
2a260 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d  e */.){.  int am
2a270 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  t;.  assert( pCu
2a280 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
2a290 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
2a2a0 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  pPage);.  assert
2a2b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a2c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a2d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a2e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2a2f0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2a300 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2a310 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a320 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a330 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2a340 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
2a350 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2a360 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2a370 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ze>0 );.  assert
2a380 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
2a390 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61 67  yload>pCur->pPag
2a3a0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52  e->aData || CORR
2a3b0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
2a3c0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
2a3d0 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50  Payload<pCur->pP
2a3e0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  age->aDataEnd ||
2a3f0 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
2a400 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
2a410 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d  nLocal;.  if( am
2a420 74 3e 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50  t>(int)(pCur->pP
2a430 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  age->aDataEnd - 
2a440 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2a450 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  oad) ){.    /* T
2a460 68 65 72 65 20 69 73 20 74 6f 6f 20 6c 69 74 74  here is too litt
2a470 6c 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  le space on the 
2a480 70 61 67 65 20 66 6f 72 20 74 68 65 20 65 78 70  page for the exp
2a490 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20  ected amount.   
2a4a0 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e   ** of local con
2a4b0 74 65 6e 74 2e 20 44 61 74 61 62 61 73 65 20 6d  tent. Database m
2a4c0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2a4d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  */.    assert( C
2a4e0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
2a4f0 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28 69   amt = MAX(0, (i
2a500 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  nt)(pCur->pPage-
2a510 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
2a520 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
2a530 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d  );.  }.  *pAmt =
2a540 20 28 75 33 32 29 61 6d 74 3b 0a 20 20 72 65 74   (u32)amt;.  ret
2a550 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d  urn (void*)pCur-
2a560 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
2a570 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
2a580 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
2a590 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
2a5a0 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
2a5b0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
2a5c0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
2a5d0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
2a5e0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
2a5f0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2a600 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
2a610 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
2a620 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
2a630 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
2a640 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
2a650 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
2a660 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
2a670 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
2a680 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
2a690 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
2a6a0 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
2a6b0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
2a6c0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
2a6d0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
2a6e0 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
2a6f0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
2a700 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
2a710 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
2a720 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
2a730 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
2a740 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
2a750 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
2a760 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
2a770 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
2a780 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
2a790 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
2a7a0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
2a7b0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
2a7c0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50  d *sqlite3BtreeP
2a7d0 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75  ayloadFetch(BtCu
2a7e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
2a7f0 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
2a800 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
2a810 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
2a820 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2a830 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
2a840 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
2a850 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
2a860 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
2a870 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2a880 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
2a890 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
2a8a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2a8b0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
2a8c0 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
2a8d0 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
2a8e0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
2a8f0 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
2a900 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
2a910 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
2a920 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
2a930 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
2a940 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
2a950 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
2a960 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
2a970 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
2a980 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
2a990 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
2a9a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a9b0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
2a9c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2a9d0 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
2a9e0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a9f0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2aa00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2aa10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2aa20 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2aa30 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
2aa40 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
2aa50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
2aa60 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
2aa70 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
2aa80 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
2aa90 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
2aaa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2aab0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2aac0 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   }.  pCur->info.
2aad0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2aae0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2aaf0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2ab00 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2ab10 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
2ab20 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43  Cur->iPage] = pC
2ab30 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e  ur->ix;.  pCur->
2ab40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2ab50 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  ge] = pCur->pPag
2ab60 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  e;.  pCur->ix = 
2ab70 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
2ab80 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74  ++;.  return get
2ab90 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2aba0 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d   newPgno, &pCur-
2abb0 3e 70 50 61 67 65 2c 20 70 43 75 72 2c 20 70 43  >pPage, pCur, pC
2abc0 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2abd0 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  s);.}..#ifdef SQ
2abe0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2abf0 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
2ac00 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
2ac10 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
2ac20 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2ac30 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
2ac40 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
2ac50 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
2ac60 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
2ac70 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
2ac80 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
2ac90 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
2aca0 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
2acb0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
2acc0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
2acd0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
2ace0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
2acf0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
2ad00 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2ad10 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
2ad20 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
2ad30 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
2ad40 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
2ad50 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52  ild){.  if( CORR
2ad60 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
2ad70 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69    /* The conditi
2ad80 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77  ons tested below
2ad90 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72   might not be tr
2ada0 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ue.             
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2adc0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64  * in a corrupt d
2add0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73  atabase */.  ass
2ade0 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
2adf0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
2ae00 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
2ae10 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
2ae20 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
2ae30 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2ae40 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2ae50 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
2ae60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2ae70 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
2ae80 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
2ae90 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
2aea0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
2aeb0 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
2aec0 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
2aed0 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
2aee0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2aef0 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
2af00 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
2af10 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
2af20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
2af30 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
2af40 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
2af50 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
2af60 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
2af70 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
2af80 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
2af90 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
2afa0 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
2afb0 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
2afc0 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
2afd0 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
2afe0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
2aff0 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
2b000 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2b010 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65  {.  MemPage *pLe
2b020 61 66 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  af;.  assert( cu
2b030 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2b040 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b050 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2b060 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2b070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b080 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
2b090 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2b0a0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  ge );.  assertPa
2b0b0 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
2b0c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b0d0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
2b0e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b0f0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
2b100 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70    pCur->pPage->p
2b110 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63  gno.  );.  testc
2b120 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
2b130 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
2b140 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
2b150 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
2b160 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Cell );.  pCur->
2b170 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2b180 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2b190 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2b1a0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2b1b0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78  vfl);.  pCur->ix
2b1c0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2b1d0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20  Cur->iPage-1];. 
2b1e0 20 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 70   pLeaf = pCur->p
2b1f0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50  Page;.  pCur->pP
2b200 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2b210 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65  ge[--pCur->iPage
2b220 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ];.  releasePage
2b230 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a  NotNull(pLeaf);.
2b240 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2b250 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
2b260 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
2b270 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
2b280 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
2b290 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
2b2a0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
2b2b0 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
2b2c0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
2b2d0 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
2b2e0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
2b2f0 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
2b300 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2b310 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
2b320 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
2b330 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
2b340 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
2b350 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
2b360 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
2b370 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
2b380 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2b390 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
2b3a0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
2b3b0 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
2b3c0 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
2b3d0 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
2b3e0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
2b3f0 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
2b400 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61  CURSOR_INVALID a
2b410 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
2b420 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
2b430 4d 50 54 59 2e 20 4f 74 68 65 72 77 69 73 65 2c  MPTY. Otherwise,
2b440 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
2b450 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
2b460 6f 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  o the first cell
2b470 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
2b480 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74  root.** (or virt
2b490 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
2b4a0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
2b4b0 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
2b4c0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
2b4d0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
2b4e0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
2b4f0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
2b500 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
2b510 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
2b520 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
2b530 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
2b540 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
2b550 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
2b560 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
2b570 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
2b580 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
2b590 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
2b5a0 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
2b5b0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
2b5c0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
2b5d0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
2b5e0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
2b5f0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
2b600 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
2b610 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
2b620 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
2b630 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
2b640 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
2b650 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
2b660 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
2b670 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
2b680 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
2b690 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
2b6a0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
2b6b0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2b6c0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
2b6d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2b6e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b6f0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2b710 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
2b720 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2b730 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
2b740 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
2b750 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2b760 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
2b770 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
2b780 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2b790 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2b7a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3c 20   pCur->eState < 
2b7b0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2b7c0 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67  EK || pCur->iPag
2b7d0 65 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e<0 );.  assert(
2b7e0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e   pCur->pgnoRoot>
2b7f0 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
2b800 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  <0 );..  if( pCu
2b810 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
2b820 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2b830 67 65 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  ge ){.      rele
2b840 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2b850 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
2b860 20 20 20 77 68 69 6c 65 28 20 2d 2d 70 43 75 72     while( --pCur
2b870 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2b880 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
2b890 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
2b8a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
2b8b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b8c0 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
2b8d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
2b8e0 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69       goto skip_i
2b8f0 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  nit;.    }.  }el
2b900 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
2b910 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
2b920 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2b930 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2b940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b950 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b  _EMPTY;.  }else{
2b960 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b970 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
2b980 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
2b990 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
2b9a0 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
2b9b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
2b9c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2b9d0 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LT ){.        as
2b9e0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2b9f0 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
2ba00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2ba10 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
2ba20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ba30 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2ba40 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
2ba50 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
2ba60 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
2ba70 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
2ba80 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2ba90 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20  &pCur->pPage,.  
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bab0 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63        0, pCur->c
2bac0 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20  urPagerFlags);. 
2bad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
2baf0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2bb00 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2bb10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2bb20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
2bb30 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  age = 0;.    pCu
2bb40 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70  r->curIntKey = p
2bb50 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
2bb60 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20  ey;.  }.  pRoot 
2bb70 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2bb80 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
2bb90 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
2bba0 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Root );..  /* If
2bbb0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
2bbc0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
2bbd0 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
2bbe0 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
2bbf0 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74  rsor.  ** expect
2bc00 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
2bc10 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
2bc20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
2bc30 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a  pKeyInfo is.  **
2bc40 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
2bc50 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
2bc60 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
2bc70 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
2bc80 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  e,.  ** return a
2bc90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2bca0 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20   error. .  **.  
2bcb0 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  ** Earlier versi
2bcc0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73  ons of SQLite as
2bcd0 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20  sumed that this 
2bce0 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66  test could not f
2bcf0 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  ail.  ** if the 
2bd00 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c  root page was al
2bd10 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65  ready loaded whe
2bd20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2bd30 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e  was called (i.e.
2bd40 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69  .  ** if pCur->i
2bd50 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68  Page>=0). But th
2bd60 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20  is is not so if 
2bd70 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2bd80 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20  corrupted .  ** 
2bd90 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68  in such a way th
2bda0 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73  at page pRoot is
2bdb0 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73   linked into a s
2bdc0 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62  econd b-tree tab
2bdd0 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65  le .  ** (or the
2bde0 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a   freelist).  */.
2bdf0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
2be00 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52  >intKey==1 || pR
2be10 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  oot->intKey==0 )
2be20 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69  ;.  if( pRoot->i
2be30 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75  sInit==0 || (pCu
2be40 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
2be50 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29  =pRoot->intKey )
2be60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2be70 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
2be80 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
2be90 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20   }..skip_init:  
2bea0 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b  .  pCur->ix = 0;
2beb0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2bec0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2bed0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2bee0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
2bef0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2bf00 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52  alidOvfl);..  pR
2bf10 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  oot = pCur->pPag
2bf20 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  e;.  if( pRoot->
2bf30 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
2bf40 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2bf50 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
2bf60 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
2bf70 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
2bf80 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
2bf90 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
2bfa0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2bfb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2bfc0 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
2bfd0 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
2bfe0 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
2bff0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
2c000 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2c010 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
2c020 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2c030 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
2c040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
2c050 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2c060 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2c070 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54  rc = SQLITE_EMPT
2c080 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  Y;.  }.  return 
2c090 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2c0a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2c0b0 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
2c0c0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
2c0d0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
2c0e0 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
2c0f0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2c100 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
2c110 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
2c120 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
2c130 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
2c140 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
2c150 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
2c160 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2c170 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2c180 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2c190 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
2c1a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c1b0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
2c1c0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2c1d0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2c1e0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2c1f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2c200 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2c210 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
2c220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2c230 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  (pPage = pCur->p
2c240 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  Page)->leaf ){. 
2c250 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c260 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  >ix<pPage->nCell
2c270 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
2c280 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2c290 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  (pPage, pCur->ix
2c2a0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
2c2b0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
2c2c0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2c2d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c2e0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2c2f0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
2c300 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2c310 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2c320 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
2c330 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2c340 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
2c350 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
2c360 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
2c370 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
2c380 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2c390 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
2c3a0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2c3b0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
2c3c0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
2c3d0 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
2c3e0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
2c3f0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
2c400 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
2c410 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
2c420 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
2c430 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
2c440 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
2c450 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
2c460 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
2c470 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
2c480 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2c490 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2c4a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2c4b0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2c4c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c4d0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2c4e0 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
2c4f0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2c500 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2c510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c520 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2c530 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2c540 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
2c550 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
2c560 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
2c570 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2c580 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2c590 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2c5a0 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d  Cur->ix = pPage-
2c5b0 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d  >nCell;.    rc =
2c5c0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2c5d0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
2c5e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2c5f0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78  ;.  }.  pCur->ix
2c600 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
2c610 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  1;.  assert( pCu
2c620 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2c630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2c640 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2c650 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d  BTCF_ValidNKey)=
2c660 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
2c670 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
2c680 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2c690 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
2c6a0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
2c6b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2c6c0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
2c6d0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
2c6e0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
2c6f0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
2c700 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
2c710 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
2c720 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
2c730 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2c740 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
2c750 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2c760 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2c770 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
2c780 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2c790 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2c7a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c7b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2c7c0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2c7d0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
2c7e0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2c7f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2c810 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
2c820 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
2c830 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
2c840 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
2c850 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
2c860 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2c870 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73  _EMPTY ){.    as
2c880 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2c890 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2c8a0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
2c8b0 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
2c8c0 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
2c8d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
2c8e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
2c8f0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2c900 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2c910 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2c920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2c930 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2c940 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2c950 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2c960 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2c970 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2c980 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2c990 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2c9a0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2c9b0 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
2c9c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2c9d0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2c9e0 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
2c9f0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2ca00 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ca10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ca20 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2ca30 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2ca40 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2ca50 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
2ca60 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
2ca70 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
2ca80 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
2ca90 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
2caa0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2cab0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2cac0 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
2cad0 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
2cae0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
2caf0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
2cb00 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
2cb10 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2cb20 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
2cb30 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
2cb40 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2cb50 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
2cb60 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
2cb70 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
2cb80 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
2cb90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2cba0 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
2cbb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
2cbc0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
2cbd0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2cbe0 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67  ->ix==pCur->pPag
2cbf0 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  e->nCell-1 );.  
2cc00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cc10 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23  pPage->leaf );.#
2cc20 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
2cc30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2cc40 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2cc50 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2cc60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cc70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2cc80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2cc90 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a  R_VALID );.    *
2cca0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63  pRes = 0;.    rc
2ccb0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
2ccc0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  st(pCur);.    if
2ccd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cce0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  ){.      pCur->c
2ccf0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2cd00 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73  AtLast;.    }els
2cd10 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e{.      pCur->c
2cd20 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2cd30 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20  _AtLast;.    }. 
2cd40 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2cd50 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
2cd60 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2cd70 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2cd80 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2cd90 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
2cda0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
2cdb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2cdc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cdd0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2cde0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2cdf0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2ce00 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2ce10 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2ce20 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2ce30 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2ce40 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2ce50 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2ce60 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2ce70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2ce80 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2ce90 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2cea0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2ceb0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2cec0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2ced0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2cee0 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2cef0 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2cf00 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2cf10 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2cf20 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2cf30 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2cf40 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2cf50 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2cf60 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2cf70 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2cf80 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2cf90 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2cfa0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2cfb0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2cfc0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2cfd0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2cfe0 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2cff0 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2d000 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2d010 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2d020 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2d030 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2d040 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2d050 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2d060 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2d070 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2d080 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2d090 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2d0a0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2d0b0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2d0c0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2d0d0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2d0e0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2d0f0 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2d100 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2d110 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2d120 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2d130 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2d140 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2d150 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2d160 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2d170 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2d180 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2d190 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2d1b0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2d1c0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2d1d0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2d1e0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2d1f0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2d200 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2d210 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2d220 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2d230 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2d240 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2d250 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2d260 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2d270 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2d280 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2d290 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2d2a0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2d2b0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2d2c0 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2d2d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2d2e0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2d2f0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2d300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d310 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2d320 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2d330 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2d340 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2d350 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2d360 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2d370 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2d380 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2d390 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2d3a0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2d3b0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2d3c0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2d3d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d3f0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2d400 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2d410 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2d420 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2d430 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2d440 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2d450 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2d460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2d470 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d480 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2d490 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2d4a0 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2d4b0 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2d4c0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2d4d0 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
2d4e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2d4f0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d500 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
2d510 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
2d520 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
2d530 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
2d540 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
2d550 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
2d560 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
2d570 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
2d580 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
2d590 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
2d5a0 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
2d5b0 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
2d5c0 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
2d5d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
2d5e0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2d5f0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2d600 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
2d610 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2d620 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2d630 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2d640 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d650 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2d660 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2d670 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
2d680 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
2d690 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2d6a0 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20  AtLast)!=0 ){.  
2d6b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
2d6c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d6d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d6e0 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
2d6f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65  the requested ke
2d700 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  y is one more th
2d710 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
2d720 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  key, then.      
2d730 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68  ** try to get th
2d740 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ere using sqlite
2d750 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74  3BtreeNext() rat
2d760 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a  her than a full.
2d770 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20        ** binary 
2d780 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73  search.  This is
2d790 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2d7a0 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72   only.  The corr
2d7b0 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20  ect answer.     
2d7c0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74   ** is still obt
2d7d0 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68  ained without th
2d7e0 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20  is case, only a 
2d7f0 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77  little more slow
2d800 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ely */.      if(
2d810 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2d820 2b 31 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  +1==intKey ){.  
2d830 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2d840 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2d850 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2d860 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
2d870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d890 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
2d8a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2d8b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2d8c0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2d8d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d8e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2d900 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2d910 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
2d920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d930 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
2d940 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
2d950 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2d960 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2d970 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2d980 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2d990 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2d9a0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2d9b0 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2d9c0 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2d9d0 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2d9e0 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2d9f0 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2da00 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2da10 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2da20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2da30 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2da40 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2da50 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2da60 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2da70 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2da80 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2da90 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2daa0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2dab0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2dac0 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2dad0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2dae0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2daf0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2db00 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2db10 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2db20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2db30 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
2db40 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2db50 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2db60 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2db70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
2db80 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2db90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2dba0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2dbb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2dbc0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29  age->nCell > 0 )
2dbd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2dbe0 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43  ->iPage==0 || pC
2dbf0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2dc00 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2dc10 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2dc20 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2dc30 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2dc40 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2dc50 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2dc60 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2dc70 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2dc80 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2dc90 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38  r->pPage;.    u8
2dca0 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcc0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2dcd0 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
2dce0 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
2dcf0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
2dd00 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
2dd10 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
2dd20 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
2dd30 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
2dd40 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
2dd50 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
2dd60 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
2dd70 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
2dd80 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
2dd90 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
2dda0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
2ddb0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
2ddc0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
2ddd0 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
2dde0 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
2ddf0 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
2de00 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
2de10 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
2de20 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
2de30 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
2de40 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2de50 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
2de60 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
2de70 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
2de80 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
2de90 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2dea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2deb0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2dec0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ded0 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
2dee0 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
2def0 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
2df00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2df10 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
2df20 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
2df30 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
2df40 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
2df50 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
2df60 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
2df70 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
2df80 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
2df90 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2dfa0 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
2dfb0 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
2dfc0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2dfd0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
2dfe0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2dff0 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2e000 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
2e010 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
2e020 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
2e030 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2e040 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
2e050 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2e060 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
2e070 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a  ge->aDataEnd ){.
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2e090 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2e0a0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
2e0b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e0c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e0d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
2e0e0 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
2e0f0 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
2e100 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2e110 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
2e120 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2e130 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
2e140 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2e150 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
2e160 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2e170 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
2e180 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
2e190 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2e1a0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2e1b0 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
2e1c0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2e1d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2e1e0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
2e1f0 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
2e200 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2e210 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2e220 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2e230 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2e240 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2e250 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2e260 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2e270 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2e280 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2e290 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2e2a0 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
2e2b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2e2c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2e2d0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2e2e0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2e2f0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2e300 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2e310 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2e320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e330 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2e350 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2e360 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2e370 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2e380 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2e390 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
2e3a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2e3b0 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2e3c0 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
2e3d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2e3e0 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
2e3f0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
2e400 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2e410 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2e420 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2e430 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
2e440 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
2e450 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
2e460 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
2e470 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
2e480 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2e490 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
2e4a0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
2e4b0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
2e4c0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
2e4d0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
2e4e0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
2e4f0 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
2e500 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
2e510 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
2e520 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
2e530 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
2e540 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
2e550 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
2e560 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
2e570 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
2e580 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
2e590 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
2e5a0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
2e5b0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
2e5c0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
2e5d0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
2e5e0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
2e5f0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
2e600 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e610 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
2e620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2e630 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
2e640 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
2e650 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
2e660 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
2e670 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
2e680 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
2e690 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
2e6a0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
2e6b0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2e6c0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
2e6d0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
2e6e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
2e6f0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2e700 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2e710 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
2e720 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2e730 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2e740 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2e750 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2e760 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
2e770 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2e780 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
2e790 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
2e7a0 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
2e7b0 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
2e7c0 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
2e7d0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
2e7e0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2e7f0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2e800 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
2e810 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
2e820 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
2e830 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
2e840 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2e850 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
2e860 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2e870 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2e880 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
2e890 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2e8a0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2e8b0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2e8c0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2e8d0 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
2e8e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e8f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2e900 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
2e910 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
2e920 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2e930 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
2e940 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
2e950 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
2e960 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
2e970 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
2e980 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
2e990 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
2e9a0 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
2e9b0 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
2e9c0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
2e9d0 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
2e9e0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
2e9f0 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
2ea00 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
2ea10 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
2ea20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
2ea30 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
2ea40 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
2ea50 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
2ea60 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
2ea70 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
2ea80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2ea90 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
2eaa0 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
2eab0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
2eac0 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
2ead0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2eae0 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
2eaf0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
2eb00 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
2eb10 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
2eb20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
2eb30 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
2eb40 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
2eb50 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
2eb60 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
2eb70 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
2eb80 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2eb90 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
2eba0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
2ebb0 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
2ebc0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
2ebd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ebe0 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a   nCell<0 );   /*
2ebf0 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a   True if key siz
2ec00 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72  e is 2^32 or mor
2ec10 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  e */.          t
2ec20 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2ec30 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  0 );  /* Invalid
2ec40 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2ec50 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20   0x80 0x00 */.  
2ec60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2ec70 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f  ( nCell==1 );  /
2ec80 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2ec90 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2eca0 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x01 */.         
2ecb0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2ecc0 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  ==2 );  /* Minim
2ecd0 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b  um legal index k
2ece0 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ey size */.     
2ecf0 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32       if( nCell<2
2ed00 20 7c 7c 20 6e 43 65 6c 6c 2f 70 43 75 72 2d 3e   || nCell/pCur->
2ed10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e  pBt->usableSize>
2ed20 70 43 75 72 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  pCur->pBt->nPage
2ed30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ed40 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2ed50 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
2ed60 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2ed70 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2ed80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ed90 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2eda0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2edb0 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2edc0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2edd0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2ede0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2edf0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2ee00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2ee10 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2ee20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ee30 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2ee40 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2ee50 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2ee60 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2ee70 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2ee80 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2ee90 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  0);.          pC
2eea0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2eeb0 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b  ~BTCF_ValidOvfl;
2eec0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2eed0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2eee0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2eef0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2ef00 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2ef10 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2ef20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2ef30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
2ef40 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2ef50 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2ef60 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2ef70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2ef80 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2ef90 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2efa0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2efb0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2efc0 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2efd0 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2efe0 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2eff0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2f000 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2f010 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2f020 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2f030 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2f040 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2f050 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2f060 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2f070 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2f080 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2f090 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f0a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f0b0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2f0c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2f0d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f0e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2f0f0 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2f100 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2f110 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2f120 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2f130 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2f140 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2f150 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2f160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f170 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
2f180 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2f190 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2f1a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2f1b0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2f1c0 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2f1d0 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
2f1e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2f1f0 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
2f200 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
2f210 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
2f220 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f230 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2f240 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2f250 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
2f260 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2f270 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2f280 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
2f290 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2f2a0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
2f2b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2f2c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
2f2d0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2f2e0 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
2f2f0 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
2f300 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
2f310 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
2f320 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
2f330 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2f340 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2f350 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f360 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2f370 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2f380 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
2f390 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20   }.    pCur->ix 
2f3a0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
2f3b0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2f3c0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
2f3d0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2f3e0 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
2f3f0 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
2f400 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2f410 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2f420 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2f430 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2f440 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f450 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2f460 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2f470 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2f480 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2f490 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2f4a0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2f4b0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2f4c0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2f4d0 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2f4e0 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2f4f0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2f500 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2f510 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2f520 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2f530 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2f540 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2f550 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2f560 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2f570 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2f580 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2f590 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2f5a0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2f5b0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2f5c0 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2f5d0 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2f5e0 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2f5f0 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2f600 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2f610 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2f620 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2f630 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2f640 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2f650 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2f660 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2f670 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2f680 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2f690 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20  an estimate for 
2f6a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2f6b0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2f6c0 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
2f6d0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65  pointing to.  Re
2f6e0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2f6f0 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74  number if no est
2f700 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e 74  imate is current
2f710 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ly .** available
2f720 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
2f730 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74  BtreeRowCountEst
2f740 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2f750 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20  {.  i64 n;.  u8 
2f760 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  i;..  assert( cu
2f770 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2f780 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2f790 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2f7a0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2f7b0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2f7c0 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74  );..  /* Current
2f7d0 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61 63  ly this interfac
2f7e0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
2f7f0 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61   by the OP_IfSma
2f800 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ller.  ** opcode
2f810 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63 61  , and it that ca
2f820 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 69  se the cursor wi
2f830 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c  ll always be val
2f840 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c  id and.  ** will
2f850 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f   always point to
2f860 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f   a leaf node. */
2f870 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
2f880 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2f890 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75 72  R_VALID) ) retur
2f8a0 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45  n -1;.  if( NEVE
2f8b0 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  R(pCur->pPage->l
2f8c0 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  eaf==0) ) return
2f8d0 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72   -1;..  n = pCur
2f8e0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  ->pPage->nCell;.
2f8f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75    for(i=0; i<pCu
2f900 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
2f910 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61      n *= pCur->a
2f920 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b  pPage[i]->nCell;
2f930 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
2f940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2f950 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2f960 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2f970 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2f980 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
2f990 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54  :.**.**    SQLIT
2f9a0 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63  E_OK        succ
2f9b0 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  ess.**    SQLITE
2f9c0 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f  _DONE      curso
2f9d0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
2f9e0 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73  nting at the las
2f9f0 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  t element.**    
2fa00 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20  otherwise       
2fa10 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
2fa20 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
2fa30 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2fa40 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2fa50 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2fa60 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2fa70 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2fa80 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2fa90 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2faa0 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2fab0 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2fac0 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2fad0 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2fae0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2faf0 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2fb00 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2fb10 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2fb20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2fb30 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2fb40 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2fb50 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2fb60 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2fb70 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69  sor..**.** If bi
2fb80 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20  t 0x01 of the F 
2fb90 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69  argument in sqli
2fba0 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46  te3BtreeNext(C,F
2fbb0 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65  ) is 1, then the
2fbc0 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65  .** cursor corre
2fbd0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2fbe0 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
2fbf0 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2fc00 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
2fc10 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
2fc20 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
2fc30 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
2fc40 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  e F argument.** 
2fc50 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
2fc60 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c   implement.  SQL
2fc70 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2fc80 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2fc90 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69  t use.** this hi
2fca0 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
2fcb0 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
2fcc0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2fcd0 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
2fce0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2fcf0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
2fd00 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
2fd10 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2fd20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2fd30 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ed(pCur) );.  if
2fd40 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2fd50 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2fd60 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2fd70 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2fd80 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2fd90 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   );.    rc = res
2fda0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2fdb0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2fdc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fdd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fde0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2fdf0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2fe00 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2fe10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2fe20 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
2fe30 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2fe40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2fe50 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
2fe60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2fe70 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2fe80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2fe90 69 70 4e 65 78 74 3e 30 20 29 20 72 65 74 75 72  ipNext>0 ) retur
2fea0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2feb0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2fec0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2fed0 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69   idx = ++pCur->i
2fee0 78 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  x;.  if( !pPage-
2fef0 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 2f  >isInit ){.    /
2ff00 2a 20 54 68 65 20 6f 6e 6c 79 20 6b 6e 6f 77 6e  * The only known
2ff10 20 77 61 79 20 66 6f 72 20 74 68 69 73 20 74 6f   way for this to
2ff20 20 68 61 70 70 65 6e 20 69 73 20 66 6f 72 20 74   happen is for t
2ff30 68 65 72 65 20 74 6f 20 62 65 20 61 0a 20 20 20  here to be a.   
2ff40 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 53 51   ** recursive SQ
2ff50 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  L function that 
2ff60 64 6f 65 73 20 61 20 44 45 4c 45 54 45 20 6f 70  does a DELETE op
2ff70 65 72 61 74 69 6f 6e 20 61 73 20 70 61 72 74 20  eration as part 
2ff80 6f 66 20 61 0a 20 20 20 20 2a 2a 20 53 45 4c 45  of a.    ** SELE
2ff90 43 54 20 77 68 69 63 68 20 64 65 6c 65 74 65 73  CT which deletes
2ffa0 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 66 72 6f   content out fro
2ffb0 6d 20 75 6e 64 65 72 20 61 6e 20 61 63 74 69 76  m under an activ
2ffc0 65 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20  e cursor.    ** 
2ffd0 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
2ffe0 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 72 65  abase file where
2fff0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
30000 20 44 45 4c 45 54 45 2d 65 64 20 66 72 6f 6d 0a   DELETE-ed from.
30010 20 20 20 20 2a 2a 20 68 61 73 20 70 61 67 65 73      ** has pages
30020 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20   in common with 
30030 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
30040 71 75 65 72 69 65 64 2e 20 20 53 65 65 20 54 48  queried.  See TH
30050 33 0a 20 20 20 20 2a 2a 20 6d 6f 64 75 6c 65 20  3.    ** module 
30060 63 6f 76 31 2f 62 74 72 65 65 37 38 2e 74 65 73  cov1/btree78.tes
30070 74 20 74 65 73 74 63 61 73 65 20 32 32 30 20 28  t testcase 220 (
30080 32 30 31 38 2d 30 36 2d 30 38 29 20 66 6f 72 20  2018-06-08) for 
30090 61 6e 0a 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c  an.    ** exampl
300a0 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  e. */.    return
300b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
300c0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
300d0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
300e0 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c  file is corrupt,
300f0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
30100 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  for the value of
30110 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65   idx .  ** to be
30120 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54   invalid here. T
30130 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
30140 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63  ur if a second c
30150 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20  ursor modifies. 
30160 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69   ** the page whi
30170 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  le cursor pCur i
30180 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
30190 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69  rence to it. Whi
301a0 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79  ch can.  ** only
301b0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64   happen if the d
301c0 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
301d0 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  pt in such a way
301e0 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a   as to link the.
301f0 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d    ** page into m
30200 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
30210 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ree structure. *
30220 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64  /.  testcase( id
30230 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x>pPage->nCell )
30240 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  ;..  if( idx>=pP
30250 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
30260 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
30270 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
30280 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
30290 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
302a0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
302b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
302c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
302d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
302e0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
302f0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
30300 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
30310 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
30320 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
30330 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
30340 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
30350 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
30360 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
30370 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
30380 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
30390 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
303a0 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69  >pPage;.    }whi
303b0 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50  le( pCur->ix>=pP
303c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
303d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
303e0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
303f0 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  urn sqlite3Btree
30400 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20  Next(pCur, 0);. 
30410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
30440 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
30450 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
30460 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
30470 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
30480 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
30490 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
304a0 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
304b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
304c0 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67  flags){.  MemPag
304d0 65 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e 55 53  e *pPage;.  UNUS
304e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c  ED_PARAMETER( fl
304f0 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20  ags );  /* Used 
30500 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f  in COMDB2 but no
30510 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20  t native SQLite 
30520 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  */.  assert( cur
30530 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
30540 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
30550 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
30560 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 70 43 75  lags==1 );.  pCu
30570 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
30580 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
30590 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
305a0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
305b0 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70  idOvfl);.  if( p
305c0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
305d0 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75  SOR_VALID ) retu
305e0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
305f0 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  r);.  pPage = pC
30600 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
30610 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70   (++pCur->ix)>=p
30620 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
30630 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
30640 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e     return btreeN
30650 65 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ext(pCur);.  }. 
30660 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
30670 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
30680 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
30690 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
306a0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
306b0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
306c0 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
306d0 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
306e0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
306f0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
30700 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  se..** Return va
30710 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lues:.**.**     
30720 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75  SQLITE_OK     su
30730 63 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c  ccess.**     SQL
30740 49 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63  ITE_DONE   the c
30750 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
30760 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c   on the first el
30770 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62  ement of the tab
30780 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77  le.**     otherw
30790 69 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e  ise     some kin
307a0 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72  d of error occur
307b0 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  red.**.** The ma
307c0 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
307d0 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  s sqlite3BtreePr
307e0 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20  evious().  That 
307f0 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
30800 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
30810 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
30820 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69  erely decrementi
30830 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
30840 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
30850 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65  dx.** to the pre
30860 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68  vious cell on th
30870 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
30880 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
30890 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a  reePrevious().**
308a0 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
308b0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
308c0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
308d0 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
308e0 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72  erent page.** or
308f0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
30900 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
30910 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
30920 20 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73   F argument to s
30930 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
30940 6f 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74  ous(C,F) is 1, t
30950 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  hen.** the curso
30960 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
30970 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
30980 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  d this routine c
30990 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a  ould have been.*
309a0 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  * skipped if the
309b0 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
309c0 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64  een a unique ind
309d0 65 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d  ex.  The F argum
309e0 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74  ent is a.** hint
309f0 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
30a00 74 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 53  t.  The native S
30a10 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
30a20 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
30a30 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  not.** use this 
30a40 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32  hint, but COMDB2
30a50 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   does..*/.static
30a60 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
30a70 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f   int btreePrevio
30a80 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
30a90 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
30aa0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
30ab0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
30ac0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
30ad0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
30ae0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
30af0 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
30b00 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
30b10 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
30b20 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
30b30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
30b40 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
30b50 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
30b60 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
30b70 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
30b80 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
30b90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30ba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30bb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
30bc0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
30bd0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
30be0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72  State ){.      r
30bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
30c00 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  E;.    }.    if(
30c10 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
30c20 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
30c30 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
30c40 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
30c50 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
30c60 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
30c70 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
30c80 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
30c90 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
30ca0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
30cb0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
30cc0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
30cd0 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
30ce0 64 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20  dx = pCur->ix;. 
30cf0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
30d00 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
30d10 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
30d20 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
30d30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30d40 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
30d50 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
30d60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30d70 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d  while( pCur->ix=
30d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
30d90 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
30da0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
30db0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
30dc0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
30dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
30de0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
30df0 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
30e00 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
30e10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
30e20 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
30e30 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
30e40 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
30e50 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
30e60 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
30e70 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  >ix--;.    pPage
30e80 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
30e90 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
30ea0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
30eb0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
30ec0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
30ed0 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 30  Previous(pCur, 0
30ee0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
30ef0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30f00 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
30f10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
30f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
30f30 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
30f40 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29  pCur, int flags)
30f50 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
30f60 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
30f70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
30f80 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
30f90 61 67 73 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  ags==1 );.  UNUS
30fa0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c  ED_PARAMETER( fl
30fb0 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20  ags );  /* Used 
30fc0 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f  in COMDB2 but no
30fd0 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20  t native SQLite 
30fe0 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  */.  pCur->curFl
30ff0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
31000 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
31010 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
31020 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
31030 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
31040 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
31050 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
31060 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a   || pCur->ix==0.
31070 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67     || pCur->pPag
31080 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a  e->leaf==0.  ){.
31090 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
310a0 50 72 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a  Previous(pCur);.
310b0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d    }.  pCur->ix--
310c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
310d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
310e0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
310f0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
31100 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
31110 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
31120 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
31130 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
31140 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
31150 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
31160 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
31170 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
31180 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
31190 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
311a0 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
311b0 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
311c0 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
311d0 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
311e0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
311f0 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
31200 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
31210 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
31220 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
31230 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
31240 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
31250 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
31260 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
31270 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74    *ppPage is set
31280 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20   to NULL in the 
31290 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
312a0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
312b0 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
312c0 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
312d0 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d  n an effort is m
312e0 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
312f0 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
31300 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
31310 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
31320 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
31330 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
31340 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
31350 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
31360 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
31370 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
31380 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
31390 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
313a0 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
313b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d  .**.** If the eM
313c0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
313d0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61   BTALLOC_EXACT a
313e0 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61  nd the nearby pa
313f0 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79  ge exists.** any
31400 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
31410 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
31420 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
31430 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49   be returned.  I
31440 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54  f.** eMode is BT
31450 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68  ALLOC_LT then th
31460 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20  e page returned 
31470 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61  will be less tha
31480 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f  n or equal.** to
31490 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73   nearby if any s
314a0 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e  uch page exists.
314b0 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54    If eMode is BT
314c0 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74  ALLOC_ANY then t
314d0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72  here.** are no r
314e0 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77  estrictions on w
314f0 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74  hich page is ret
31500 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
31510 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
31520 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
31530 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
31540 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
31550 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
31560 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  age,      /* Sto
31570 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  re pointer to th
31580 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
31590 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
315a0 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  *pPgno,         
315b0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70    /* Store the p
315c0 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20  age number here 
315d0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  */.  Pgno nearby
315e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
315f0 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65  earch for a page
31600 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a   near this one *
31610 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20  /.  u8 eMode    
31620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54             /* BT
31630 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41  ALLOC_EXACT, BTA
31640 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c  LLOC_LT, or BTAL
31650 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20  LOC_ANY */.){.  
31660 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
31670 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
31680 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
31690 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
316a0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
316b0 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
316c0 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
316d0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
316e0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
316f0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
31700 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
31710 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
31720 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
31730 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
31740 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
31750 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
31760 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31770 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
31780 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
31790 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
317a0 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30  ANY || (nearby>0
317b0 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   && IfNotOmitAV(
317c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
317d0 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
317e0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
317f0 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
31800 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f  ecount(pBt);.  /
31810 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
31820 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65  -05119-02637 The
31830 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
31840 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
31850 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f  fset 36.  ** sto
31860 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74  res stores the t
31870 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
31880 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
31890 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67  list. */.  n = g
318a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
318b0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
318c0 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
318d0 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e  ge-1 );.  if( n>
318e0 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72  =mxPage ){.    r
318f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
31900 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
31910 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
31920 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
31930 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
31940 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
31950 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
31960 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
31970 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
31980 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
31990 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
319a0 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
319b0 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
319c0 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d     u32 nSearch =
319d0 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f   0;   /* Count o
319e0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
319f0 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20  search attempts 
31a00 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
31a10 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
31a20 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
31a30 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
31a40 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
31a50 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
31a60 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
31a70 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
31a80 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
31a90 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
31aa0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
31ab0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
31ac0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
31ad0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31ae0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
31af0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
31b00 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
31b10 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
31b20 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  age ){.        u
31b30 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
31b40 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
31b50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
31b60 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
31b70 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
31b80 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
31b90 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
31ba0 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
31bb0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
31bc0 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
31bd0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
31be0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
31bf0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
31c00 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
31c10 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
31c20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
31c30 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
31c40 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
31c50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
31c60 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
31c70 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
31c80 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
31c90 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
31ca0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
31cb0 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
31cc0 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
31cd0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
31ce0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
31cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31d00 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
31d10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
31d20 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
31d30 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
31d40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
31d50 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
31d60 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
31d70 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
31d80 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
31d90 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
31da0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
31db0 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
31dc0 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
31dd0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
31de0 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
31df0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
31e00 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
31e10 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
31e20 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
31e30 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
31e40 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
31e50 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
31e60 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
31e70 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
31e80 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
31e90 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
31ea0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
31eb0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
31ec0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
31ed0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
31ee0 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20  01506-11053 The 
31ef0 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e  first integer on
31f00 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
31f10 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  k page.        *
31f20 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  * is the page nu
31f30 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
31f40 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31f50 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
31f60 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a   or.        ** z
31f70 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74  ero if this is t
31f80 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74  he last freelist
31f90 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a   trunk page. */.
31fa0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
31fb0 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
31fc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
31fd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31fe0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
31ff0 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31  CE-OF: R-59841-1
32000 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20  3798 The 4-byte 
32010 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
32020 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a  er at offset 32.
32030 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
32040 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
32050 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
32060 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c  age of the freel
32070 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a  ist, or zero if.
32080 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
32090 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
320a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
320b0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
320c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
320d0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
320e0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
320f0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
32100 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
32110 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68  xPage || nSearch
32120 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20  ++ > n ){.      
32130 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
32140 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76  RRUPT_PGNO(pPrev
32150 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75  Trunk ? pPrevTru
32160 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20  nk->pgno : 1);. 
32170 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32180 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
32190 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
321a0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
321b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
321c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
321d0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
321e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
321f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32210 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d  assert( pTrunk!=
32220 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
32230 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  t( pTrunk->aData
32240 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  !=0 );.      /* 
32250 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
32260 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73  3523-04394 The s
32270 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e  econd integer on
32280 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
32290 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  k page.      ** 
322a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
322b0 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74   leaf page point
322c0 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a  ers to follow. *
322d0 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  /.      k = get4
322e0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
322f0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
32300 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
32310 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
32320 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
32330 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
32340 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
32350 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
32360 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
32370 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
32380 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
32390 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
323a0 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
323b0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
323c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
323d0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
323e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
323f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32400 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
32410 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
32420 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
32430 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
32440 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32450 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
32460 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
32470 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
32480 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
32490 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
324a0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
324b0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
324c0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
324d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
324e0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
324f0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
32500 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
32510 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
32520 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
32530 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
32540 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
32550 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
32560 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
32570 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
32580 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
32590 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
325a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
325b0 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  O(iTrunk);.     
325c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
325d0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
325e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
325f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
32600 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
32610 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
32620 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
32630 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
32640 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
32650 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
32660 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
32670 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
32680 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
32690 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
326a0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
326b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
326c0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
326d0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
326e0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
326f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
32700 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
32710 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
32720 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
32730 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
32740 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32750 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32760 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
32770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
32790 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
327a0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
327b0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
327c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
327d0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
327e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
327f0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
32800 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
32810 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32820 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
32830 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32840 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32850 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
32860 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32870 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32890 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
328a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
328b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
328c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
328d0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
328e0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
328f0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32920 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
32930 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
32940 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
32950 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
32960 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
32970 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
32980 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
32990 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
329a0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
329b0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
329c0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
329d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
329e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
329f0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
32a00 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
32a10 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
32a20 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
32a30 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
32a40 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
32a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32a60 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32a70 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
32a80 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32a90 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32aa0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
32ab0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
32ac0 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
32ad0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
32ae0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
32af0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
32b00 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
32b10 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
32b20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32b40 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32b50 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32b70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32b80 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
32b90 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
32ba0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
32bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32bc0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
32bd0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
32be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
32bf0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32c00 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
32c10 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
32c20 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
32c30 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
32c40 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
32c50 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
32c60 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
32c70 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
32c80 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
32c90 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
32ca0 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
32cb0 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
32cc0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
32cd0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
32ce0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
32cf0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
32d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
32d10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
32d20 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
32d30 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
32d40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
32d50 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
32d60 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
32d70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
32d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32d90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32da0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
32db0 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
32dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
32dd0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
32de0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32df0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32e00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32e10 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
32e20 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
32e30 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
32e40 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
32e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32e60 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
32e70 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
32e80 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
32e90 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
32ea0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
32eb0 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
32ec0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
32ed0 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
32ee0 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
32ef0 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
32f00 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
32f10 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
32f20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
32f30 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
32f40 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
32f50 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
32f60 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
32f70 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
32f80 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
32f90 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
32fa0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
32fb0 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
32fc0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
32fd0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
32fe0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
32ff0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
33000 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
33010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
33020 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
33030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
33040 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
33050 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
33060 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
33070 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
33080 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
33090 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
330a0 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
330b0 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
330c0 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
330d0 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
330e0 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
330f0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
33100 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
33110 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
33120 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
33130 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
33140 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
33150 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
33160 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
33170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33180 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
33190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
331a0 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
331b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
331c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
331d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
331e0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
331f0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
33200 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
33210 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
33220 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
33230 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
33240 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
33250 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
33260 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
33270 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
33280 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
33290 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
332a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
332b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
332c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
332d0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
332e0 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
332f0 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
33300 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
33310 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
33320 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
33330 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
33340 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
33350 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
33360 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
33370 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
33380 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
33390 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
333a0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
333b0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
333c0 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
333d0 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
333e0 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
333f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33400 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
33410 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
33420 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
33430 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33440 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
33450 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
33460 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
33470 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
33480 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
33490 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
334a0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
334b0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
334c0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
334d0 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
334e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
334f0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
33500 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
33510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
33520 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
33530 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
33540 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
33550 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
33560 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
33570 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
33580 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
33590 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
335a0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
335b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
335c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
335d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
335e0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
335f0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
33600 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
33610 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33620 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
33630 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
33640 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
33650 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
33660 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33680 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
33690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
336a0 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
336b0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
336c0 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
336d0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
336e0 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
336f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
33700 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
33710 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
33720 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
33730 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
33740 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
33750 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
33760 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
33770 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
33780 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
33790 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
337a0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
337b0 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
337c0 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
337d0 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
337e0 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
337f0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
33800 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
33810 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
33820 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
33830 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
33840 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
33850 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
33860 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
33870 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
33880 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
33890 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
338a0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
338b0 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
338c0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
338d0 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
338e0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
338f0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
33900 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
33910 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
33920 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
33930 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
33940 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
33950 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
33960 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
33970 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
33980 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
33990 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
339a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
339b0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
339c0 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
339d0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
339e0 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
339f0 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
33a00 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
33a10 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
33a20 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
33a30 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
33a40 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
33a50 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
33a60 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
33a70 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
33a80 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
33a90 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
33aa0 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
33ab0 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
33ac0 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
33ad0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
33ae0 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
33af0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
33b00 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
33b10 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
33b20 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
33b30 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
33b40 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
33b50 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
33b60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33b70 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
33b80 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
33b90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33ba0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
33bb0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
33bc0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
33bd0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
33be0 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
33bf0 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
33c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33c10 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
33c20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
33c30 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
33c40 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
33c50 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
33c60 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
33c70 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
33c80 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
33c90 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
33ca0 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
33cb0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
33cc0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
33cd0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
33ce0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
33cf0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
33d00 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
33d10 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
33d20 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
33d30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33d40 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
33d50 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
33d60 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
33d70 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
33d80 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
33d90 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
33da0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
33db0 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
33dc0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
33dd0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
33de0 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
33df0 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
33e00 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
33e10 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
33e20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33e30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33e50 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
33e60 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
33e70 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
33e80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
33e90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33ea0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
33eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
33ec0 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
33ed0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
33ee0 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
33ef0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
33f00 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
33f10 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
33f20 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
33f30 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
33f40 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
33f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
33f60 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
33f70 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
33f80 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
33f90 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
33fa0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
33fb0 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
33fc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33fd0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
33fe0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33ff0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
34000 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
34010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34020 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34030 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
34040 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
34050 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
34060 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
34070 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
34080 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
34090 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
340a0 54 5f 44 42 20 7c 7c 20 2a 70 50 67 6e 6f 21 3d  T_DB || *pPgno!=
340b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
340c0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
340d0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
340e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
340f0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
34100 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
34110 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
34120 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
34130 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
34140 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
34150 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
34160 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
34170 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
34180 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
34190 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
341a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
341b0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
341c0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
341d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
341e0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
341f0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
34200 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
34210 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
34220 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
34230 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
34240 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
34250 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
34260 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
34270 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
34280 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
34290 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
342a0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
342b0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
342c0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
342d0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
342e0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
342f0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
34300 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
34310 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
34320 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
34330 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
34340 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
34350 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
34360 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
34370 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
34380 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
34390 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
343a0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
343b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
343c0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
343d0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
343e0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
343f0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
34400 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
34410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34420 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
34430 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
34440 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34460 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
34470 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
34480 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
34490 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
344a0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
344b0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
344c0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
344d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
344e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
344f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
34500 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
34510 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
34520 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
34530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34540 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
34550 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
34560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34570 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
34580 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
34590 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
345a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
345b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
345c0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
345d0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
345e0 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
345f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
34600 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
34610 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
34620 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
34630 3c 32 20 7c 7c 20 69 50 61 67 65 3e 70 42 74 2d  <2 || iPage>pBt-
34640 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  >nPage ){.    re
34650 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
34660 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
34670 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
34680 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
34690 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
346a0 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
346b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
346c0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
346d0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
346e0 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
346f0 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
34700 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
34710 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
34720 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
34730 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
34740 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
34750 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
34760 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
34770 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
34780 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
34790 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
347a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
347b0 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69  , nFree+1);..  i
347c0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
347d0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
347e0 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LETE ){.    /* I
347f0 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  f the secure_del
34800 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ete option is en
34810 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  abled, then.    
34820 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
34830 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
34840 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
34850 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
34860 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
34870 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65   && ((rc = btree
34880 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
34890 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
348a0 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
348b0 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
348c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
348d0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
348e0 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
348f0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
34900 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
34910 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
34920 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
34930 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
34940 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
34950 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
34960 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
34970 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
34980 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
34990 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
349a0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
349b0 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
349c0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
349d0 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50  M ){.    ptrmapP
349e0 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
349f0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
34a00 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  0, &rc);.    if(
34a10 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
34a20 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
34a30 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
34a40 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
34a50 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
34a60 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
34a70 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
34a80 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
34a90 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
34aa0 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
34ab0 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
34ac0 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
34ad0 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
34ae0 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
34af0 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
34b00 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
34b10 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
34b20 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
34b30 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
34b40 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
34b50 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
34b60 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
34b70 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
34b80 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
34b90 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
34ba0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
34bb0 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
34bc0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
34bd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
34be0 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  e!=0 ){.    u32 
34bf0 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
34c00 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
34c10 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
34c20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
34c30 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
34c40 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
34c50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
34c60 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
34c70 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
34c80 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
34c90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
34ca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34cb0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
34cc0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
34cd0 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
34ce0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
34cf0 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4]);.    assert(
34d00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34d10 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >32 );.    if( n
34d20 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d  Leaf > (u32)pBt-
34d30 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
34d40 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
34d50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34d60 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
34d70 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34d80 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
34d90 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f < (u32)pBt->us
34da0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
34db0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
34dc0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
34dd0 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
34de0 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
34df0 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
34e00 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
34e10 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
34e20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
34e30 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
34e40 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
34e50 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
34e60 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
34e70 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
34e80 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
34e90 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
34ea0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
34eb0 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
34ec0 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
34ed0 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
34ee0 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
34ef0 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
34f00 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
34f10 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
34f20 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
34f30 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
34f40 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
34f50 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
34f60 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
34f70 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
34f80 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
34f90 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
34fa0 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
34fb0 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
34fc0 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
34fd0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
34fe0 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
34ff0 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74  continue to rest
35000 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
35010 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
35020 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
35030 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
35040 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
35050 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
35060 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
35070 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
35080 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
35090 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
350a0 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
350b0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
350c0 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
350d0 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
350e0 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
350f0 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
35100 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -8"..      **.  
35110 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
35120 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37  OF: R-19920-1157
35130 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72  6 However, newer
35140 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
35150 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20  ite still.      
35160 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74  ** avoid using t
35170 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72  he last six entr
35180 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c  ies in the freel
35190 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61  ist trunk page a
351a0 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a  rray in.      **
351b0 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61   order that data
351c0 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74  base files creat
351d0 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73  ed by newer vers
351e0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
351f0 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72  an be.      ** r
35200 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ead by older ver
35210 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e  sions of SQLite.
35220 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35230 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35240 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
35250 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
35260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35270 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
35280 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
35290 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
352a0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
352b0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
352c0 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
352d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
352e0 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d  ( pPage && (pBt-
352f0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
35300 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d  SECURE_DELETE)==
35310 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
35320 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
35330 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
35340 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
35350 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
35360 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
35370 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  pBt, iPage);.   
35380 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
35390 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
353a0 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
353b0 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
353c0 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
353d0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  no));.      goto
353e0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
353f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
35400 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
35410 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
35420 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70  hen it was not p
35430 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
35440 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  he.  ** the page
35450 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
35460 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74  a leaf page of t
35470 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  he first trunk i
35480 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
35490 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62  .  ** Possibly b
354a0 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d  ecause the free-
354b0 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f  list is empty, o
354c0 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75  r possibly becau
354d0 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72  se the .  ** fir
354e0 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
354f0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
35500 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  l. Either way, t
35510 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
35520 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  eed.  ** will be
35530 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72  come the new fir
35540 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
35550 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
35560 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
35570 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
35580 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  !=(rc = btreeGet
35590 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
355a0 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a   &pPage, 0)) ){.
355b0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
355c0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20  e_out;.  }.  rc 
355d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
355e0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
355f0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
35600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35610 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
35620 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
35630 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
35640 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
35650 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
35660 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
35670 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
35680 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
35690 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
356a0 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
356b0 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
356c0 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
356d0 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
356e0 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
356f0 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
35700 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
35710 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
35720 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
35730 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
35740 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
35750 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  c;.}.static void
35760 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
35770 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70  e *pPage, int *p
35780 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
35790 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
357a0 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50      *pRC = freeP
357b0 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c  age2(pPage->pBt,
357c0 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70   pPage, pPage->p
357d0 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gno);.  }.}../*.
357e0 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
357f0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
35800 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
35810 69 76 65 6e 20 43 65 6c 6c 2e 20 20 53 74 6f 72  iven Cell.  Stor
35820 65 0a 2a 2a 20 73 69 7a 65 20 69 6e 66 6f 72 6d  e.** size inform
35830 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
35840 63 65 6c 6c 20 69 6e 20 70 49 6e 66 6f 2e 0a 2a  cell in pInfo..*
35850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
35860 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  arCell(.  MemPag
35870 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
35880 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
35890 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
358a0 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   Cell */.  unsig
358b0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
358c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
358d0 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f  e of the Cell */
358e0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
358f0 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  fo          /* S
35900 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ize information 
35910 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a  about the cell *
35920 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
35930 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  *pBt;.  Pgno ovf
35940 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
35950 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
35960 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
35970 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
35980 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
35990 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
359a0 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  x) );.  pPage->x
359b0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
359c0 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
359d0 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f    if( pInfo->nLo
359e0 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79  cal==pInfo->nPay
359f0 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75  load ){.    retu
35a00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
35a10 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
35a20 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
35a30 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
35a40 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74  ng */.  }.  test
35a50 63 61 73 65 28 20 70 43 65 6c 6c 20 2b 20 70 49  case( pCell + pI
35a60 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 3d 20 70 50  nfo->nSize == pP
35a70 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
35a80 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65  .  testcase( pCe
35a90 6c 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 53 69  ll + (pInfo->nSi
35aa0 7a 65 2d 31 29 20 3d 3d 20 70 50 61 67 65 2d 3e  ze-1) == pPage->
35ab0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 69 66  aDataEnd );.  if
35ac0 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d  ( pCell + pInfo-
35ad0 3e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e  >nSize > pPage->
35ae0 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20  aDataEnd ){.    
35af0 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
35b00 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
35b10 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
35b20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
35b30 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
35b40 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
35b50 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e  byte(pCell + pIn
35b60 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  fo->nSize - 4);.
35b70 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
35b80 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  Bt;.  assert( pB
35b90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
35ba0 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
35bb0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
35bc0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
35bd0 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  fl = (pInfo->nPa
35be0 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e  yload - pInfo->n
35bf0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
35c00 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
35c10 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
35c20 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
35c30 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
35c40 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
35c50 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  d + ovflPageSize
35c60 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a  )<ovflPageSize).
35c70 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f    );.  while( nO
35c80 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
35c90 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
35ca0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
35cb0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
35cc0 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
35cd0 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
35ce0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
35cf0 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
35d00 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
35d10 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
35d20 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
35d30 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
35d40 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
35d50 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
35d60 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
35d70 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
35d80 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
35d90 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
35da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
35db0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35dc0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
35dd0 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
35de0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
35df0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
35e00 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
35e10 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
35e20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
35e30 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20     }..    if( ( 
35e40 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c  pOvfl || ((pOvfl
35e50 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
35e60 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  up(pBt, ovflPgno
35e70 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26  ))!=0) ).     &&
35e80 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
35e90 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d  eRefcount(pOvfl-
35ea0 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20  >pDbPage)!=1.   
35eb0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
35ec0 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20  re is no reason 
35ed0 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  any cursor shoul
35ee0 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61  d have an outsta
35ef0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
35f00 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20  .      ** to an 
35f10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65  overflow page be
35f20 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c  longing to a cel
35f30 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  l that is being 
35f40 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e  deleted/updated.
35f50 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20  .      ** So if 
35f60 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72  there exists mor
35f70 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
35f80 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67  ence to this pag
35f90 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20  e, then it .    
35fa0 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65    ** must not re
35fb0 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66  ally be an overf
35fc0 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65  low page and the
35fd0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
35fe0 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20  e corrupt. .    
35ff0 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66    ** It is helpf
36000 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69  ul to detect thi
36010 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
36020 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73   freePage2(), as
36030 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50   .      ** freeP
36040 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20  age2() may zero 
36050 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
36060 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65  s if secure-dele
36070 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20  te mode is.     
36080 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
36090 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20  this 'overflow' 
360a0 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
360b0 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74  be a page that t
360c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  he.      ** call
360d0 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20  er is iterating 
360e0 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67  through or using
360f0 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77   in some other w
36100 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a  ay, this.      *
36110 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d  * can be problem
36120 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atic..      */. 
36130 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
36140 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
36150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36160 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
36170 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
36180 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gno);.    }..   
36190 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
361a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
361b0 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
361c0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
361d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
361e0 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
361f0 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
36200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36210 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
36220 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
36230 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
36240 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
36250 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
36260 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
36270 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
36280 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
36290 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
362a0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
362b0 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
362c0 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
362d0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
362e0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
362f0 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
36300 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
36310 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
36320 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
36330 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
36340 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
36350 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
36360 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
36370 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
36380 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
36390 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
363a0 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
363b0 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
363c0 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
363d0 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
363e0 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
363f0 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
36400 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
36410 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
36420 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
36430 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
36440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36450 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
36460 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
36470 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
36480 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
36490 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
364a0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
364b0 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
364c0 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58  BtreePayload *pX
364d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c  ,        /* Payl
364e0 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20 74  oad with which t
364f0 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
36500 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cell */.  int *p
36510 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
36520 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
36530 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
36540 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
36550 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
36560 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
36570 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a  Src, n, rc, mn;.
36580 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
36590 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
365a0 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73 69 67 6e  elease;.  unsign
365b0 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
365c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
365d0 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
365e0 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50  Shared *pBt;.  P
365f0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20  gno pgnoOvfl;.  
36600 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20  int nHeader;..  
36610 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
36620 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
36630 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
36640 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
36650 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
36660 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
36670 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
36680 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
36690 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
366a0 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
366b0 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
366c0 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
366d0 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
366e0 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
366f0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
36700 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
36710 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
36720 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
36730 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
36740 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
36750 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
36760 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
36770 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
36780 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69  hildPtrSize;.  i
36790 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
367a0 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   ){.    nPayload
367b0 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70   = pX->nData + p
367c0 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53  X->nZero;.    pS
367d0 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a  rc = pX->pData;.
367e0 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e      nSrc = pX->n
367f0 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
36800 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
36810 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e  eaf ); /* fillIn
36820 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c  Cell() only call
36830 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f  ed for leaves */
36840 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
36850 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
36860 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
36870 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61  yload);.    nHea
36880 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
36890 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
368a0 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b  , *(u64*)&pX->nK
368b0 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
368c0 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b    assert( pX->nK
368d0 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26  ey<=0x7fffffff &
368e0 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b  & pX->pKey!=0 );
368f0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79  .    nSrc = nPay
36900 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e  load = (int)pX->
36910 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
36920 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e   pX->pKey;.    n
36930 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
36940 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
36950 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
36960 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
36970 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
36980 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f 61 64 20  d */.  pPayload 
36990 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
369a0 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  ];.  if( nPayloa
369b0 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
369c0 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
369d0 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  s is the common 
369e0 63 61 73 65 20 77 68 65 72 65 20 65 76 65 72 79  case where every
369f0 74 68 69 6e 67 20 66 69 74 73 20 6f 6e 20 74 68  thing fits on th
36a00 65 20 62 74 72 65 65 20 70 61 67 65 0a 20 20 20  e btree page.   
36a10 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76 65 72 66   ** and no overf
36a20 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 72 65  low pages are re
36a30 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 6e  quired. */.    n
36a40 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
36a50 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
36a60 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
36a70 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
36a80 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
36a90 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
36aa0 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 61 73 73  ize = n;.    ass
36ab0 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50 61 79 6c  ert( nSrc<=nPayl
36ac0 6f 61 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oad );.    testc
36ad0 61 73 65 28 20 6e 53 72 63 3c 6e 50 61 79 6c 6f  ase( nSrc<nPaylo
36ae0 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ad );.    memcpy
36af0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
36b00 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d 65 6d 73   nSrc);.    mems
36b10 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e 53 72 63  et(pPayload+nSrc
36b20 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e 53  , 0, nPayload-nS
36b30 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
36b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
36b50 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
36b60 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
36b70 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
36b80 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  of the content w
36b90 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f  ill need.  ** to
36ba0 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72   spill onto over
36bb0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f  flow pages..  */
36bc0 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  .  mn = pPage->m
36bd0 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d  inLocal;.  n = m
36be0 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
36bf0 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
36c00 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
36c10 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  4);.  testcase( 
36c20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
36c30 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
36c40 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
36c50 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
36c60 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  n > pPage->maxLo
36c70 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20  cal ) n = mn;.  
36c80 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
36c90 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e   *pnSize = n + n
36ca0 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 70 50  Header + 4;.  pP
36cb0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
36cc0 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52  eader+n];.  pToR
36cd0 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 70 67  elease = 0;.  pg
36ce0 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 70 42  noOvfl = 0;.  pB
36cf0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
36d00 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
36d10 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
36d20 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
36d30 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
36d40 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
36d50 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
36d60 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
36d70 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
36d80 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
36d90 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
36da0 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
36db0 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
36dc0 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
36dd0 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
36de0 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
36df0 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
36e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e10 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
36e20 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
36e30 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
36e40 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
36e50 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
36e60 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
36e70 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
36e80 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
36e90 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
36ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
36eb0 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
36ec0 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
36ed0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
36ee0 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
36ef0 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
36f00 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
36f10 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
36f20 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
36f30 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
36f40 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
36f50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
36f60 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49  UG.  {.    CellI
36f70 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50  nfo info;.    pP
36f80 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
36f90 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
36fa0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
36fb0 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29  ( nHeader==(int)
36fc0 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  (info.pPayload -
36fd0 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61   pCell) );.    a
36fe0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
36ff0 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  ==pX->nKey );.  
37000 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a    assert( *pnSiz
37010 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20  e == info.nSize 
37020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
37030 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f  paceLeft == info
37040 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23  .nLocal );.  }.#
37050 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74  endif..  /* Writ
37060 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e  e the payload in
37070 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c  to the local Cel
37080 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20  l and any extra 
37090 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
370a0 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ges */.  while( 
370b0 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 50 61  1 ){.    n = nPa
370c0 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
370d0 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
370e0 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
370f0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
37100 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
37110 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
37120 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
37130 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
37140 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
37150 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
37160 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
37170 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
37180 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
37190 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
371a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
371b0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
371c0 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
371d0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
371e0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
371f0 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
37200 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
37210 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
37220 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
37230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
37240 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
37250 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
37260 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
37270 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
37280 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
37290 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
372a0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
372b0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
372c0 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 6d  rc>=n ){.      m
372d0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
372e0 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
372f0 6c 73 65 20 69 66 28 20 6e 53 72 63 3e 30 20 29  lse if( nSrc>0 )
37300 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e 53 72 63  {.      n = nSrc
37310 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
37320 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
37330 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
37340 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
37350 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
37360 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
37370 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 50 61  = n;.    if( nPa
37380 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72 65 61 6b  yload<=0 ) break
37390 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
373a0 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
373b0 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
373c0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
373d0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 73   -= n;.    if( s
373e0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  paceLeft==0 ){. 
373f0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f       MemPage *pO
37400 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  vfl = 0;.#ifndef
37410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
37420 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
37430 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
37440 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
37450 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
37460 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
37470 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
37480 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
37490 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
374a0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
374b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
374c0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
374d0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
374e0 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
374f0 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
37500 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
37510 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
37520 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
37530 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
37540 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
37550 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
37560 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
37570 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37580 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
37590 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
375a0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
375b0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
375c0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
375d0 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
375e0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
375f0 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
37600 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
37610 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
37620 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
37630 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
37640 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
37650 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
37660 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
37670 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
37680 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
37690 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
376a0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
376b0 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
376c0 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
376d0 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
376e0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
376f0 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
37700 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
37710 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
37720 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
37730 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
37740 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  he uninitialized
37750 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
37760 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
37770 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
37780 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
37790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
377a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
377b0 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
377c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
377d0 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
377e0 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
377f0 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
37800 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
37810 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
37820 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
37830 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
37840 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
37850 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
37860 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
37870 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37880 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
37890 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
378a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
378b0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
378c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
378d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
378e0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
378f0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
37900 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
37910 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
37920 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
37930 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
37940 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
37950 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
37960 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
37970 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
37980 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
37990 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
379a0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
379b0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
379c0 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
379d0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
379e0 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
379f0 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
37a00 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
37a10 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
37a20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
37a30 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
37a40 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
37a50 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
37a60 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
37a70 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
37a80 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
37a90 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
37aa0 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
37ab0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
37ac0 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
37ad0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
37ae0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
37af0 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
37b00 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
37b10 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
37b20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
37b30 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
37b40 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
37b50 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
37b60 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
37b70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
37b80 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  4;.    }.  }.  r
37b90 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
37ba0 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
37bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
37bc0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
37bd0 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
37be0 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
37bf0 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
37c00 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
37c10 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
37c20 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
37c30 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
37c40 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
37c50 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
37c60 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
37c70 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
37c80 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
37c90 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
37ca0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
37cb0 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
37cc0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
37cd0 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
37ce0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
37cf0 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
37d00 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
37d10 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
37d20 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
37d30 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
37d40 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
37d50 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
37d60 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
37d70 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
37d80 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
37d90 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
37da0 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
37db0 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
37dc0 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
37dd0 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
37de0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
37df0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
37e00 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
37e10 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
37e20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
37e30 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
37e40 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
37e50 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
37e60 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
37e70 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
37e80 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
37e90 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
37ea0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
37eb0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
37ec0 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
37ed0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
37ee0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
37ef0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
37f00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
37f10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
37f20 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
37f30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
37f40 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20 29  Page->nFree>=0 )
37f50 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
37f60 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
37f70 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
37f80 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  x[2*idx];.  pc =
37f90 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
37fa0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
37fb0 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74  drOffset;.  test
37fc0 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79  case( pc==get2by
37fd0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
37fe0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
37ff0 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42  pc+sz==pPage->pB
38000 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
38010 0a 20 20 69 66 28 20 70 63 2b 73 7a 20 3e 20 70  .  if( pc+sz > p
38020 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
38030 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52  eSize ){.    *pR
38040 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
38050 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
38060 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
38070 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
38080 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
38090 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  rc ){.    *pRC =
380a0 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
380b0 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
380c0 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61  ell--;.  if( pPa
380d0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
380e0 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
380f0 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
38100 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
38110 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74  = 0;.    put2byt
38120 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
38130 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
38140 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  leSize);.    pPa
38150 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
38160 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
38170 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f  ze - pPage->hdrO
38180 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20  ffset.          
38190 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70               - p
381a0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
381b0 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b  ze - 8;.  }else{
381c0 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72  .    memmove(ptr
381d0 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67  , ptr+2, 2*(pPag
381e0 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29  e->nCell - idx))
381f0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
38200 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
38210 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
38220 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
38230 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2;.  }.}../*.** 
38240 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
38250 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
38260 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
38270 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
38280 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
38290 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
382a0 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
382b0 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
382c0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
382d0 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
382e0 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
382f0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
38300 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
38310 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
38320 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
38330 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
38340 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
38350 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
38360 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
38370 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20  pPage->apOvfl[] 
38380 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
38390 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
383a0 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
383b0 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
383c0 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
383d0 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
383e0 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
383f0 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
38400 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
38410 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
38420 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
38430 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
38440 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
38450 20 2a 70 52 43 20 6d 75 73 74 20 62 65 20 53 51   *pRC must be SQ
38460 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
38470 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
38480 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
38490 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
384a0 20 20 4d 65 6d 50 61 67 65 20 2a 7