/ Hex Artifact Content
Login

Artifact f96286765cdeff388816e1cc1a20628735d5f453040cc949eb7ccadf58799e65:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1fc0: 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
1fd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1fe0: 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
1ff0: 20 75 73 65 73 20 66 72 65 65 2d 6c 69 73 74 20   uses free-list 
2000: 66 6f 72 6d 61 74 20 32 2e 20 4f 72 20 66 61 6c  format 2. Or fal
2010: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
2020: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2030: 65 46 72 65 65 6c 69 73 74 46 6f 72 6d 61 74 32  eFreelistFormat2
2040: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
2050: 0a 20 20 72 65 74 75 72 6e 20 28 70 42 74 2d 3e  .  return (pBt->
2060: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 38  pPage1->aData[18
2070: 5d 20 3e 20 32 29 3b 0a 7d 0a 23 65 6e 64 69 66  ] > 2);.}.#endif
2080: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
2090: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20a0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20b0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20c0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20d0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20e0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
20f0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2100: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2110: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2120: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2130: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2140: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2150: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2160: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2170: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2180: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
2190: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21a0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21b0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21c0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21d0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21e0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
21f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2200: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2210: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2220: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2230: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2240: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2250: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2260: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2270: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2280: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c 65 4c  eadUncommit)||eL
2290: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c  ock==WRITE_LOCK|
22a0: 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20  |iTab==1 );.  . 
22b0: 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e   /* If requestin
22c0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  g a write-lock, 
22d0: 74 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d  then the Btree m
22e0: 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e  ust have an open
22f0: 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e   write.  ** tran
2300: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20  saction on this 
2310: 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f  file. And, obvio
2320: 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74  usly, for this t
2330: 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20  o be so there . 
2340: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f   ** must be an o
2350: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
2360: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c  ction on the fil
2370: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
2380: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2390: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d  READ_LOCK || (p=
23a0: 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26  =pBt->pWriter &&
23b0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
23c0: 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61  NS_WRITE) );.  a
23d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23e0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e  AD_LOCK || pBt->
23f0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
2400: 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
2410: 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2420: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ne is a no-op if
2430: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
2440: 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  e is not enabled
2450: 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   */.  if( !p->sh
2460: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65  arable ){.    re
2470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2480: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d    }..  /* If som
2490: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
24a0: 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  on is holding an
24b0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
24c0: 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73   the.  ** reques
24d0: 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74  ted lock may not
24e0: 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20   be obtained..  
24f0: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  */.  if( pBt->pW
2500: 72 69 74 65 72 21 3d 70 20 26 26 20 28 70 42 74  riter!=p && (pBt
2510: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
2520: 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
2530: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
2540: 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
2550: 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74  ->db, pBt->pWrit
2560: 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  er->db);.    ret
2570: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2580: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2590: 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65 72 3d   }..  for(pIter=
25a0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
25b0: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
25c0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54  pNext){.    /* T
25d0: 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49  he condition (pI
25e0: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
25f0: 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k) in the follow
2600: 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20  ing if(...) .   
2610: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73   ** statement is
2620: 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f   a simplificatio
2630: 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  n of:.    **.   
2640: 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52   **   (eLock==WR
2650: 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  ITE_LOCK || pIte
2660: 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  r->eLock==WRITE_
2670: 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20  LOCK).    **.   
2680: 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f   ** since we kno
2690: 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d  w that if eLock=
26a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65  =WRITE_LOCK, the
26b0: 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  n no other conne
26c0: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79  ction.    ** may
26d0: 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f   hold a WRITE_LO
26e0: 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20  CK on any table 
26f0: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69  in this file (si
2700: 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20  nce there can.  
2710: 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73    ** only be a s
2720: 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0a 20  ingle writer).. 
2730: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
2740: 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  ( pIter->eLock==
2750: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74  READ_LOCK || pIt
2760: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45  er->eLock==WRITE
2770: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
2780: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2790: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
27a0: 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74  pBtree==p || pIt
27b0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
27c0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 70  LOCK);.    if( p
27d0: 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
27e0: 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  && pIter->iTable
27f0: 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65 72 2d  ==iTab && pIter-
2800: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b  >eLock!=eLock ){
2810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
2820: 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
2830: 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e 70 42  p->db, pIter->pB
2840: 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  tree->db);.     
2850: 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54   if( eLock==WRIT
2860: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
2870: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74    assert( p==pBt
2880: 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
2890: 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
28a0: 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44 49 4e  gs |= BTS_PENDIN
28b0: 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  G;.      }.     
28c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
28d0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
28e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  E;.    }.  }.  r
28f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2900: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
2910: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2920: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
2930: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2940: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
2950: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
2960: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2970: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
2980: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
2990: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
29a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
29b0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
29c0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
29d0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
29e0: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
29f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2a00: 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f  ssumes the follo
2a10: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61  wing:.**.**   (a
2a20: 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ) The specified 
2a30: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69  Btree object p i
2a40: 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
2a50: 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20   sharable.**    
2a60: 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65     database (one
2a70: 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72   with the BtShar
2a80: 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67  ed.sharable flag
2a90: 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a   set), and.**.**
2aa0: 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20     (b) No other 
2ab0: 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f  Btree objects ho
2ac0: 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63  ld a lock that c
2ad0: 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20  onflicts.**     
2ae0: 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65    with the reque
2af0: 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20  sted lock (i.e. 
2b00: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2b10: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a  TableLock() has.
2b20: 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79  **       already
2b30: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64   been called and
2b40: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
2b50: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  _OK)..**.** SQLI
2b60: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2b70: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2b80: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
2b90: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  lly. SQLITE_NOME
2ba0: 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  M .** is returne
2bb0: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74  d if a malloc at
2bc0: 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a  tempt fails..*/.
2bd0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68  static int setSh
2be0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2bf0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2c00: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
2c10: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2c20: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2c30: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
2c40: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
2c50: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2c60: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2c70: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2c80: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2c90: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2ca0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2cb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2cc0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f  =0 );..  /* A co
2cd0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
2ce0: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
2cf0: 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c  ed flag set will
2d00: 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20   never try to.  
2d10: 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64  ** obtain a read
2d20: 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73  -lock using this
2d30: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f   function. The o
2d40: 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62  nly read-lock ob
2d50: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61  tained.  ** by a
2d60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72   connection in r
2d70: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2d80: 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73  mode is on the s
2d90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
2da0: 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  ** table, and th
2db0: 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  at lock is obtai
2dc0: 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69  ned in BtreeBegi
2dd0: 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20  nTrans().  */.  
2de0: 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64  assert( 0==(p->d
2df0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2e00: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20 7c 7c  ReadUncommit) ||
2e10: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
2e20: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
2e30: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
2e40: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2e50: 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d  on a sharable b-
2e60: 74 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20  tree after it . 
2e70: 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74   ** has been det
2e80: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
2e90: 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c  other b-tree hol
2ea0: 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67  ds a conflicting
2eb0: 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
2ec0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
2ed0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
2ee0: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68  LITE_OK==querySh
2ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2f00: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
2f10: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ock) );..  /* Fi
2f20: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
2f30: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
2f40: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
2f50: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
2f60: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
2f70: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
2f80: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
2f90: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
2fa0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
2fb0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2fc0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
2fd0: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
2fe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2ff0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
3000: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
3010: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
3020: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
3030: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
3040: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
3050: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
3060: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
3070: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
3080: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
3090: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
30a0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ock *)sqlite3Mal
30b0: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
30c0: 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28  tLock));.    if(
30d0: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   !pLock ){.     
30e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
30f0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
3100: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  .    pLock->iTab
3110: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
3120: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d   pLock->pBtree =
3130: 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70   p;.    pLock->p
3140: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
3150: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63  k;.    pBt->pLoc
3160: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = pLock;.  }..
3170: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c    /* Set the BtL
3180: 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ock.eLock variab
3190: 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  le to the maximu
31a0: 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  m of the current
31b0: 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74   lock.  ** and t
31c0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
31d0: 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  k. This means if
31e0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61   a write-lock wa
31f0: 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20  s already held. 
3200: 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c   ** and a read-l
3210: 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77  ock requested, w
3220: 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63  e don't incorrec
3230: 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68  tly downgrade th
3240: 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61  e lock..  */.  a
3250: 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43  ssert( WRITE_LOC
3260: 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20  K>READ_LOCK );. 
3270: 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b   if( eLock>pLock
3280: 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ->eLock ){.    p
3290: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c  Lock->eLock = eL
32a0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ock;.  }..  retu
32b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32c0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
32d0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
32e0: 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
32f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3300: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52  ED_CACHE./*.** R
3310: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74  elease all the t
3320: 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b  able locks (lock
3330: 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63  s obtained via c
3340: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73  alls to.** the s
3350: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
3360: 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75  leLock() procedu
3370: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
3380: 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a  e object p..**.*
3390: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
33a0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72  assumes that Btr
33b0: 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e  ee p has an open
33c0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a   read or write .
33d0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
33e0: 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20  If it does not, 
33f0: 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e  then the BTS_PEN
3400: 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79  DING flag.** may
3410: 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   be incorrectly 
3420: 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
3430: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c  ic void clearAll
3440: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3450: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
3460: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3470: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
3480: 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26  ock **ppIter = &
3490: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61  pBt->pLock;..  a
34a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
34b0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
34c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
34d0: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d  >sharable || 0==
34e0: 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73  *ppIter );.  ass
34f0: 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
3500: 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  0 );..  while( *
3510: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
3520: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
3530: 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72  pIter;.    asser
3540: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
3550: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
3560: 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  E)==0 || pBt->pW
3570: 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42  riter==pLock->pB
3580: 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65  tree );.    asse
3590: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  rt( pLock->pBtre
35a0: 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63  e->inTrans>=pLoc
35b0: 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k->eLock );.    
35c0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
35d0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
35e0: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
35f0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Next;.      asse
3600: 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  rt( pLock->iTabl
3610: 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26  e!=1 || pLock==&
3620: 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  p->lock );.     
3630: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62   if( pLock->iTab
3640: 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  le!=1 ){.       
3650: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
3660: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ock);.      }.  
3670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
3680: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
3690: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
36a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ..  assert( (pBt
36b0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
36c0: 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20  _PENDING)==0 || 
36d0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
36e0: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
36f0: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74  er==p ){.    pBt
3700: 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20  ->pWriter = 0;. 
3710: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3720: 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53   &= ~(BTS_EXCLUS
3730: 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29  IVE|BTS_PENDING)
3740: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
3750: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
3760: 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =2 ){.    /* Thi
3770: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3780: 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20  lled when Btree 
3790: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
37a0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
37b0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
37c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
37d0: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
37e0: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
37f0: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3800: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3810: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3820: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3830: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3840: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
3850: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
3860: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
3870: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
3880: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3890: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
38a0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
38b0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
38c0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
38d0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73   BTS_PENDING mus
38e0: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
38f0: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3900: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3910: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3920: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3930: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3940: 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a  = ~BTS_PENDING;.
3950: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
3960: 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67  s function chang
3970: 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63  es all write-loc
3980: 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  ks held by Btree
3990: 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63   p into read-loc
39a0: 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ks..*/.static vo
39b0: 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  id downgradeAllS
39c0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
39d0: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
39e0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
39f0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
3a00: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3a10: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3a20: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
3a30: 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Writer = 0;.    
3a40: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
3a50: 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45   ~(BTS_EXCLUSIVE
3a60: 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20  |BTS_PENDING);. 
3a70: 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74     for(pLock=pBt
3a80: 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20  ->pLock; pLock; 
3a90: 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65  pLock=pLock->pNe
3aa0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
3ab0: 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d  t( pLock->eLock=
3ac0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c  =READ_LOCK || pL
3ad0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3ae0: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65  ;.      pLock->e
3af0: 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
3b00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
3b10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3b20: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3b30: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
3b40: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
3b50: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3b60: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3b70: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3b80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3b90: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3ba0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3bb0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3bc0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3bd0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3be0: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3bf0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3c00: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3c10: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3c20: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3c30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3c50: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
3c60: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
3c70: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
3c80: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
3c90: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
3ca0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
3cb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
3cc0: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
3cd0: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
3ce0: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
3cf0: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
3d00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
3d10: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
3d20: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
3d30: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
3d40: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
3d50: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
3d60: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
3d70: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
3d80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
3d90: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
3da0: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
3db0: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
3dc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3dd0: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
3de0: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
3df0: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
3e00: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
3e10: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
3e20: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
3e30: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
3e40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
3e50: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
3e60: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
3e70: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
3e80: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
3e90: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
3ea0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
3eb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
3ec0: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
3ed0: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
3ee0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3ef0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
3f00: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
3f10: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
3f20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3f30: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
3f40: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3f50: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3f60: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
3f70: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
3f80: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
3f90: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
3fa0: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
3fb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3fc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3fd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3fe0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3ff0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
4000: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
4010: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
4020: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4030: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
4040: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
4050: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4060: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4070: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4080: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4090: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
40a0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
40b0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
40c0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
40d0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
40e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
40f0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
4100: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4110: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
4120: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
4130: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
4140: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
4150: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4160: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4170: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4180: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4190: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
41a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
41b0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
41c0: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
41d0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
41e0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
41f0: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
4200: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
4210: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
4220: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
4230: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
4240: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
4250: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4260: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4270: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4280: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4290: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
42a0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
42b0: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
42c0: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
42d0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
42e0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
42f0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
4300: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
4310: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
4320: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
4330: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
4340: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
4350: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4360: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4370: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4380: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4390: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
43a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
43b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
43c0: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
43d0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
43e0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4400: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
4410: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
4420: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
4430: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
4440: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
4450: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4460: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4470: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4480: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4490: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
44a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
44b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
44c0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
44d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
44e0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
44f0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
4500: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
4510: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4520: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
4530: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
4540: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
4550: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4560: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4570: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4580: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4590: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
45a0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
45b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
45c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
45d0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
45e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
45f0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
4600: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
4610: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
4620: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
4630: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4640: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
4650: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4660: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4670: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4680: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4690: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
46a0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
46b0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
46c0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
46d0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
46e0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
46f0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4700: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4710: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4720: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4730: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4740: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4750: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4760: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4770: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4780: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4790: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
47a0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
47b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
47c0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
47d0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
47e0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
47f0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4800: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4810: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4820: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4830: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4840: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4850: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4860: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4870: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4880: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4890: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
48a0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
48b0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
48c0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
48d0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
48e0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
48f0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4900: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4910: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4920: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4930: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4940: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4950: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4960: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4970: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4980: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4990: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
49a0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
49b0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
49c0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
49d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
49e0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
49f0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4a00: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4a10: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4a20: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4a30: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4a40: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4a50: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4a60: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4a70: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4a80: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4a90: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4aa0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4ab0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4ac0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4ad0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4ae0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4af0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4b00: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4b10: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4b20: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4b30: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4b40: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4b50: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4b60: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4b70: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4b80: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4b90: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4ba0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4bb0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4bc0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4bd0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4be0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4bf0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4c00: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4c10: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4c20: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4c30: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4c40: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4c50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4c60: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4c70: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4c80: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4c90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4ca0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4cb0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4cc0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4cd0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4ce0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4cf0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4d00: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4d10: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4d20: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4d30: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4d40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4d50: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4d60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4d70: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4d80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4d90: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4da0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4db0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4dc0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4dd0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4de0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4df0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4e00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4e10: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4e20: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4e30: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4e40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4e50: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4e60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4e70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4e80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4e90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4ea0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4eb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4ec0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4ed0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4ee0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4ef0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4f00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4f10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4f20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4f30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4f40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4f50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4f60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4f70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4f80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4f90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4fa0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4fb0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4fc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4fd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4fe0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ff0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
5000: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
5010: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
5020: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
5030: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
5040: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
5050: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5060: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5070: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5080: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5090: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
50a0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
50b0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
50c0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
50d0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
50e0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
50f0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
5100: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
5110: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5120: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5130: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5140: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5150: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5160: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5170: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5180: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5190: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
51a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
51b0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
51c0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
51d0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
51e0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
51f0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
5200: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
5210: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5220: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5230: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5240: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5250: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5260: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5270: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5280: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5290: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
52a0: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
52b0: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
52c0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
52d0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
52e0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
52f0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
5300: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
5310: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5320: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5330: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5340: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5350: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5360: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5370: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5380: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5390: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
53a0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
53b0: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
53c0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
53d0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
53e0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
53f0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
5400: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
5410: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5420: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5430: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5440: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5450: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5460: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5470: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5480: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5490: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
54a0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
54b0: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
54c0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
54d0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
54e0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
54f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
5500: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
5510: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5520: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5530: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5540: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5550: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5560: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5570: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5580: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5590: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
55a0: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
55b0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
55c0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
55d0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
55e0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
55f0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
5600: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
5610: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5620: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5630: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5640: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5650: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5660: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5670: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5680: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5690: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
56a0: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
56b0: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
56c0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
56d0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
56e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
56f0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
5700: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
5710: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5720: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5730: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5740: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5760: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5770: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5790: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
57a0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
57b0: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
57c0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
57d0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
57e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
57f0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
5800: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
5810: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5820: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5830: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5840: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5850: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5860: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5870: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5880: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5890: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
58a0: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
58b0: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
58c0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
58d0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
58e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
58f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5900: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5910: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5920: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5930: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5940: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5950: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5960: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5970: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5980: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5990: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
59a0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
59b0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
59c0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
59d0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
59e0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
59f0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
5a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
5a10: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5a20: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5a30: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5a40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5a50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5a60: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5a70: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5a80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a90: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5aa0: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5ab0: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
5ac0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
5ad0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
5ae0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
5af0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
5b00: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
5b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5b20: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5b30: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5b40: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5b50: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5b60: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5b70: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5b80: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5b90: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5ba0: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5bb0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5bc0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5bd0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5be0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5bf0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5c00: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5c10: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5c20: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5c30: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5c40: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5c50: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5c60: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5c70: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5c80: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5c90: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5ca0: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5cb0: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5cc0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5cd0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5ce0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5cf0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5d00: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5d10: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5d20: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5d30: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5d40: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5d50: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5d60: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5d70: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5d80: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5d90: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5da0: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5db0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5dc0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5dd0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5de0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5df0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5e00: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5e10: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5e20: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5e30: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5e40: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5e50: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5e60: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5e70: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5e80: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5e90: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5ea0: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5eb0: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5ec0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5ed0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5ee0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5ef0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5f00: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5f10: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5f20: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5f30: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5f40: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5f50: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5f60: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5f70: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5f80: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5f90: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5fa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5fb0: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5fc0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5fd0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5fe0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ff0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
6000: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6010: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6020: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
6030: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
6040: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
6050: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
6060: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
6070: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
6080: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6090: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
60a0: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
60b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
60c0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
60d0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
60e0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
60f0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
6100: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
6110: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6120: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6130: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6140: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6150: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6160: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6170: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6180: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6190: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
61a0: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
61b0: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
61c0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
61d0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
61e0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
61f0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
6200: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
6210: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6220: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6230: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6240: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6250: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6260: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6270: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6280: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6290: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
62a0: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
62b0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
62c0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
62d0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
62e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
62f0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
6300: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
6310: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6320: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6330: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6340: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6350: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6360: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6370: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6380: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6390: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
63a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
63b0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
63c0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
63d0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
63e0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
63f0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
6400: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
6410: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6420: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6440: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6460: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6470: 67 65 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ge>=0 );.       
6480: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
6490: 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a  CursorPages(p);.
64a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
64b0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
64c0: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
64d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
64e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
64f0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
6500: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
6510: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
6520: 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42  reeClearCursor(B
6530: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6540: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6550: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
6560: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
6570: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6580: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6590: 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
65a0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
65b0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  D;.}../*.** In t
65c0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
65d0: 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
65e0: 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
65f0: 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
6600: 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
6610: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
6620: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
6630: 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
6640: 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
6650: 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
6660: 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
6670: 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74  he work..*/.stat
6680: 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65  ic int btreeMove
6690: 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
66a0: 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
66b0: 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
66c0: 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
66d0: 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
66e0: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
66f0: 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
6700: 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
6710: 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
6720: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
6730: 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
6740: 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
6750: 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
6760: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
6770: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
6780: 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
6790: 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
67a0: 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
67b0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
67c0: 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
67d0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
6800: 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
6810: 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
6820: 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
6830: 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69  ndex key */..  i
6840: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
6850: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
6860: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
6870: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
6880: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
6890: 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72  ackedRecord(pCur
68a0: 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  ->pKeyInfo);.   
68b0: 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20   if( pIdxKey==0 
68c0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
68d0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
68e0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
68f0: 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b  dUnpack(pCur->pK
6900: 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65  eyInfo, (int)nKe
6910: 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79  y, pKey, pIdxKey
6920: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6930: 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b  ey->nField==0 ){
6940: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6950: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
6960: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
6970: 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 29  r->iPage]->pgno)
6980: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
6990: 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  eto_done;.    }.
69a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
69b0: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
69c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
69d0: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
69e0: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
69f0: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
6a00: 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20  ;.moveto_done:. 
6a10: 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
6a20: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6a30: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
6a40: 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a  ->db, pIdxKey);.
6a50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
6a70: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
6a80: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
6a90: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
6aa0: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
6ab0: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
6ac0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6ad0: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
6ae0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
6af0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
6b00: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
6b10: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
6b20: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6b30: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
6b40: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
6b50: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
6b60: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6b70: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
6b80: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
6b90: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
6ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6bb0: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
6bc0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
6bd0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
6be0: 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65  rc;.  int skipNe
6bf0: 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  xt;.  assert( cu
6c00: 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
6c10: 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
6c20: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
6c30: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
6c40: 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
6c50: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6c60: 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
6c70: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
6c80: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pNext;.  }.  pCu
6c90: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6ca0: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
6cb0: 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
6cc0: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
6cd0: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
6ce0: 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66  &skipNext);.  if
6cf0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6d00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6d10: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
6d20: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
6d30: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
6d40: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6d50: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
6d60: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d70: 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
6d80: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
6d90: 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20  t |= skipNext;. 
6da0: 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
6db0: 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65  pNext && pCur->e
6dc0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6dd0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75  LID ){.      pCu
6de0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6df0: 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20  OR_SKIPNEXT;.   
6e00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6e10: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
6e20: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6e30: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
6e40: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6e50: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
6e60: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
6e70: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6e80: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
6e90: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
6ea0: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
6eb0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
6ec0: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
6ed0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
6ee0: 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77  on where.** it w
6ef0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20  as last placed, 
6f00: 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61  or has been inva
6f10: 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20  lidated for any 
6f20: 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a  other reason..**
6f30: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
6f40: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
6f50: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
6f60: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
6f70: 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72  ut.** from under
6f80: 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70   them, for examp
6f90: 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68  le.  Cursor migh
6fa0: 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61  t also move if a
6fb0: 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62   btree.** is reb
6fc0: 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  alanced..**.** C
6fd0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
6fe0: 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ine with a NULL 
6ff0: 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72  cursor pointer r
7000: 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a  eturns false..**
7010: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61  .** Use the sepa
7020: 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65  rate sqlite3Btre
7030: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
7040: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74   routine to rest
7050: 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  ore a cursor.** 
7060: 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74  back to where it
7070: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20   ought to be if 
7080: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
7090: 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e  urns true..*/.in
70a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
70b0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
70c0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
70d0: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
70e0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
70f0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  D;.}../*.** This
7100: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
7110: 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  s a cursor back 
7120: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
7130: 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69  position after i
7140: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f  t.** has been mo
7150: 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73  ved by some outs
7160: 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75  ide activity (su
7170: 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65  ch as a btree re
7180: 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20  balance or.** a 
7190: 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20  row having been 
71a0: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
71b0: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
71c0: 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  r).  .**.** On s
71d0: 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69  uccess, the *pDi
71e0: 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d  fferentRow param
71f0: 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66  eter is false if
7200: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
7210: 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
7220: 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  at exactly the s
7230: 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66  ame row.  *pDiff
7240: 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72  erntRow is the r
7250: 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ow the cursor.**
7260: 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f   was pointing to
7270: 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
7280: 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63  d, forcing the c
7290: 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
72a0: 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79  o some.** nearby
72b0: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
72c0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
72d0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
72e0: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
72f0: 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a   just returned.*
7300: 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69  * TRUE from sqli
7310: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
7320: 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74  sMoved()..*/.int
7330: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7340: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
7350: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
7360: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a  pDifferentRow){.
7370: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
7380: 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
7390: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
73a0: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
73b0: 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72  ALID );.  rc = r
73c0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
73d0: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
73e0: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69  ( rc ){.    *pDi
73f0: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
7400: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7410: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
7420: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7430: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66  LID ){.    *pDif
7440: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
7450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
7460: 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
7470: 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44  xt==0 );.    *pD
7480: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
7490: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
74a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
74b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
74c0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
74d0: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74  .** Provide hint
74e0: 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e  s to the cursor.
74f0: 20 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72    The particular
7500: 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64   hint given (and
7510: 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64   the type.** and
7520: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76   number of the v
7530: 61 72 61 72 67 73 20 70 61 72 61 6d 65 74 65 72  arargs parameter
7540: 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  s) is determined
7550: 20 62 79 20 74 68 65 20 65 48 69 6e 74 54 79 70   by the eHintTyp
7560: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20  e.** parameter. 
7570: 20 53 65 65 20 74 68 65 20 64 65 66 69 6e 69 74   See the definit
7580: 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45  ions of the BTRE
7590: 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20  E_HINT_* macros 
75a0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
75b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
75c0: 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75  eCursorHint(BtCu
75d0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
75e0: 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b  eHintType, ...){
75f0: 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  /* Used only 
7600: 62 79 20 73 79 73 74 65 6d 20 74 68 61 74 20 73  by system that s
7610: 75 62 73 74 69 74 75 74 65 20 74 68 65 69 72 20  ubstitute their 
7620: 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69  own storage engi
7630: 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ne */.}.#endif..
7640: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c  /*.** Provide fl
7650: 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20  ag hints to the 
7660: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  cursor..*/.void 
7670: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7680: 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75  orHintFlags(BtCu
7690: 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69  rsor *pCur, unsi
76a0: 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72  gned x){.  asser
76b0: 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b  t( x==BTREE_SEEK
76c0: 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f  _EQ || x==BTREE_
76d0: 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30  BULKLOAD || x==0
76e0: 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74   );.  pCur->hint
76f0: 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  s = x;.}...#ifnd
7700: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7710: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
7720: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
7730: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
7740: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
7750: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
7760: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
7770: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
7780: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
7790: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
77a0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
77b0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   number..**.** R
77c0: 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76  eturn 0 (not a v
77d0: 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70  alid page) for p
77e0: 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65  gno==1 since the
77f0: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e  re is.** no poin
7800: 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74  ter map associat
7810: 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20  ed with page 1. 
7820: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63   The integrity_c
7830: 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65  heck logic.** re
7840: 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d  quires that ptrm
7850: 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31  apPageno(*,1)!=1
7860: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
7870: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
7880: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
7890: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
78a0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
78b0: 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c  .  Pgno iPtrMap,
78c0: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
78d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
78e0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
78f0: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29  ;.  if( pgno<2 )
7900: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61   return 0;.  nPa
7910: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
7920: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
7930: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
7940: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
7950: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
7960: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
7970: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
7980: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
7990: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
79a0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
79b0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
79c0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
79d0: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
79e0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
79f0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
7a00: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
7a10: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
7a20: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
7a30: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
7a40: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
7a50: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
7a60: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
7a70: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
7a80: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73  **.** If *pRC is
7a90: 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a   initially non-z
7aa0: 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f  ero (non-SQLITE_
7ab0: 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OK) then this ro
7ac0: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f  utine is.** a no
7ad0: 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  -op.  If an erro
7ae0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70  r occurs, the ap
7af0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
7b00: 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a  code is written.
7b10: 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f  ** into *pRC..*/
7b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
7b30: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
7b40: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
7b50: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
7b60: 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29  arent, int *pRC)
7b70: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
7b80: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
7b90: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7ba0: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
7bb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7bc0: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
7bd0: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
7be0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7bf0: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
7c00: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
7c10: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
7c20: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
7c30: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
7c40: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f   rc;           /
7c50: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
7c60: 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
7c70: 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
7c80: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
7c90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7ca0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
7cb0: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
7cc0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
7cd0: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
7ce0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
7cf0: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
7d00: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
7d10: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
7d20: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
7d30: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
7d40: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
7d50: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
7d60: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
7d70: 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
7d80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7d90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7da0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
7db0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
7dc0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
7dd0: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
7de0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
7df0: 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20   &pDbPage, 0);. 
7e00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7e10: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
7e20: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
7e30: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
7e40: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
7e50: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
7e60: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
7e70: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
7e80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7e90: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
7ea0: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
7eb0: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
7ec0: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
7ed0: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
7ee0: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
7ef0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
7f00: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
7f10: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
7f20: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
7f30: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7f40: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
7f50: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
7f60: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
7f70: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
7f80: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
7f90: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
7fa0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
7fb0: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
7fc0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7fd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
7fe0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
7ff0: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
8000: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
8010: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
8020: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
8030: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
8040: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8050: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
8060: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
8070: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
8080: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
8090: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
80a0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
80b0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
80c0: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
80d0: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
80e0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
80f0: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
8100: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
8110: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
8120: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
8130: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
8140: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
8150: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
8160: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
8170: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
8180: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
8190: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
81a0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
81b0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
81c0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
81d0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
81e0: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
81f0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8200: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
8210: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
8220: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8230: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
8240: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
8250: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8260: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
8270: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
8280: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
8290: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
82a0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
82b0: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
82c0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
82d0: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
82e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
82f0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
8300: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30  map, &pDbPage, 0
8310: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
8320: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8330: 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d  .  }.  pPtrmap =
8340: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8350: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8360: 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d  ge);..  offset =
8370: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
8380: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
8390: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
83a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
83b0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
83c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
83d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
83e0: 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
83f0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8400: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8410: 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  5 );.  assert( p
8420: 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70  EType!=0 );.  *p
8430: 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b  EType = pPtrmap[
8440: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70  offset];.  if( p
8450: 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20  Pgno ) *pPgno = 
8460: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
8470: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20  p[offset+1]);.. 
8480: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
8490: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ef(pDbPage);.  i
84a0: 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20  f( *pEType<1 || 
84b0: 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75  *pEType>5 ) retu
84c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
84d0: 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29 3b  T_PGNO(iPtrmap);
84e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
84f0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
8500: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
8510: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
8520: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
8530: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
8540: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
8550: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
8560: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
8570: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
8580: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
8590: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
85a0: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
85b0: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
85c0: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
85d0: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
85e0: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
85f0: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
8600: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
8610: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
8620: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
8630: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
8640: 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  * findCellPastPt
8650: 72 28 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d  r() does the sam
8660: 65 20 65 78 63 65 70 74 20 69 74 20 73 6b 69 70  e except it skip
8670: 73 20 70 61 73 74 20 74 68 65 20 69 6e 69 74 69  s past the initi
8680: 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69  al.** 4-byte chi
8690: 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64  ld pointer found
86a0: 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   on interior pag
86b0: 65 73 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  es, if there is 
86c0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  one..**.** This 
86d0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
86e0: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
86f0: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
8700: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
8710: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
8720: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
8730: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
8740: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
8750: 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50  2byteAligned(&(P
8760: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
8770: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
8780: 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c  ndCellPastPtr(P,
8790: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
87a0: 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d  taOfst + ((P)->m
87b0: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
87c0: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
87d0: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
87e0: 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )).../*.** This 
87f0: 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70  is common tail p
8800: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74  rocessing for bt
8810: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
8820: 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61  ) and.** btreePa
8830: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
8840: 29 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  ) for the case w
8850: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65  hen the cell doe
8860: 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65  s not fit entire
8870: 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c  ly.** on a singl
8880: 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20  e B-tree page.  
8890: 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61  Make necessary a
88a0: 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68  djustments to th
88b0: 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74  e CellInfo.** st
88c0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
88d0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
88e0: 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  NE void btreePar
88f0: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
8900: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d  ForOverflow(.  M
8910: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
8920: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
8930: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
8940: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
8950: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
8960: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
8970: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
8980: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8990: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
89a0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
89b0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49  ure */.){.  /* I
89c0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
89d0: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
89e0: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
89f0: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
8a00: 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20  .  ** to decide 
8a10: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
8a20: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
8a30: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
8a40: 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c  onto.  ** overfl
8a50: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
8a60: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
8a70: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
8a80: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a  t of unused.  **
8a90: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
8aa0: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
8ab0: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
8ac0: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
8ad0: 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  ge.  ** in betwe
8ae0: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
8af0: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20  maxLocal..  **. 
8b00: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
8b10: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
8b20: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
8b30: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
8b40: 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77  n any.  ** way w
8b50: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
8b60: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
8b70: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a  le format..  */.
8b80: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
8b90: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
8ba0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
8bb0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
8bc0: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
8bd0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
8be0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
8bf0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
8c00: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
8c10: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
8c20: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
8c30: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
8c40: 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  .  minLocal = pP
8c50: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
8c60: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
8c70: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73  e->maxLocal;.  s
8c80: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
8c90: 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79  l + (pInfo->nPay
8ca0: 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  load - minLocal)
8cb0: 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  %(pPage->pBt->us
8cc0: 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74  ableSize-4);.  t
8cd0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8ce0: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
8cf0: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
8d00: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  s==maxLocal+1 );
8d10: 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c  .  if( surplus <
8d20: 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  = maxLocal ){.  
8d30: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8d40: 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a  = (u16)surplus;.
8d50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
8d60: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8d70: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  6)minLocal;.  }.
8d80: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8d90: 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70   (u16)(&pInfo->p
8da0: 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e  Payload[pInfo->n
8db0: 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20  Local] - pCell) 
8dc0: 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 4;.}../*.** Th
8dd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
8de0: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
8df0: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
8e00: 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65  MemPage.xParseCe
8e10: 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  ll().** method..
8e20: 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  **.** Parse a ce
8e30: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
8e40: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
8e50: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
8e60: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65  ure..**.** btree
8e70: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20  ParseCellPtr()  
8e80: 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65        =>   table
8e90: 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65   btree leaf node
8ea0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
8eb0: 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  ellNoPayload()  
8ec0: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
8ed0: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a   internal nodes.
8ee0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
8ef0: 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e  lPtrIndex()   =>
8f00: 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e     index btree n
8f10: 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  odes.**.** There
8f20: 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70   is also a wrapp
8f30: 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65  er function btre
8f40: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61  eParseCell() tha
8f50: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61  t works for.** a
8f60: 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73  ll MemPage types
8f70: 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72 65   and that refere
8f80: 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79  nces the cell by
8f90: 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74 68   index rather th
8fa0: 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72  an.** by pointer
8fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8fc0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8fd0: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d  trNoPayload(.  M
8fe0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
8ff0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9000: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9010: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9020: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9030: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9040: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9050: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9060: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9070: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9080: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ure */.){.  asse
9090: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
90a0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
90b0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
90c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
90d0: 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  af==0 );.  asser
90e0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
90f0: 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66  trSize==4 );.#if
9100: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
9110: 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
9120: 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e  ETER(pPage);.#en
9130: 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  dif.  pInfo->nSi
9140: 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69  ze = 4 + getVari
9150: 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75  nt(&pCell[4], (u
9160: 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79  64*)&pInfo->nKey
9170: 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  );.  pInfo->nPay
9180: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66  load = 0;.  pInf
9190: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
91a0: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
91b0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
91c0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
91d0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
91e0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
91f0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
9200: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
9210: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
9220: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9230: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9240: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9250: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9260: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9270: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9280: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9290: 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  u8 *pIter;      
92a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73          /* For s
92b0: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
92c0: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e  pCell */.  u32 n
92d0: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
92e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
92f0: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
9300: 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69  yload */.  u64 i
9310: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
9320: 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20     /* Extracted 
9330: 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  Key value */..  
9340: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9350: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9360: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9370: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9380: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
9390: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
93a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
93b0: 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20  intKeyLeaf );.  
93c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
93d0: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29  hildPtrSize==0 )
93e0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
93f0: 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  l;..  /* The nex
9400: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
9410: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9420: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9430: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
9440: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79  nt32(pIter, nPay
9450: 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  load);.  **.  **
9460: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
9470: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
9480: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
9490: 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
94a0: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
94b0: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
94c0: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
94d0: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
94e0: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
94f0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
9500: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
9510: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
9520: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
9530: 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72   }while( (*pIter
9540: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
9550: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
9560: 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  Iter++;..  /* Th
9570: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
9580: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
9590: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
95a0: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
95b0: 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28  tVarint(pIter, (
95c0: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
95d0: 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  y);.  **.  ** Th
95e0: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
95f0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
9600: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
9610: 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72  .  iKey = *pIter
9620: 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78  ;.  if( iKey>=0x
9630: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
9640: 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a  nd = &pIter[7];.
9650: 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66      iKey &= 0x7f
9660: 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a  ;.    while(1){.
9670: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b        iKey = (iK
9680: 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ey<<7) | (*++pIt
9690: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
96a0: 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30    if( (*pIter)<0
96b0: 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  x80 ) break;.   
96c0: 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45     if( pIter>=pE
96d0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b  nd ){.        iK
96e0: 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c  ey = (iKey<<8) |
96f0: 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20   *++pIter;.     
9700: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9710: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  }.    }.  }.  pI
9720: 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ter++;..  pInfo-
9730: 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26  >nKey = *(i64*)&
9740: 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  iKey;.  pInfo->n
9750: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
9760: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
9770: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
9780: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9790: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
97a0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
97b0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
97c0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
97d0: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
97e0: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
97f0: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9800: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9810: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9820: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
9830: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
9840: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9850: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
9860: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
9870: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
9880: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9890: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
98a0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
98b0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
98c0: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
98d0: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
98e0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
98f0: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
9900: 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
9910: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
9920: 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70  verflow(pPage, p
9930: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
9940: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9950: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
9960: 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67  rIndex(.  MemPag
9970: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9980: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9990: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
99a0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
99b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
99c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
99d0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
99e0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
99f0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
9a00: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
9a10: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
9a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9a30: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
9a40: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
9a50: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9a70: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
9a80: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
9a90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9aa0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9ab0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9ac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ad0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
9ae0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
9af0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9b00: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30  e->intKeyLeaf==0
9b10: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
9b20: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
9b30: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61  ldPtrSize;.  nPa
9b40: 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a  yload = *pIter;.
9b50: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d    if( nPayload>=
9b60: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
9b70: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
9b80: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26  ;.    nPayload &
9b90: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
9ba0: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
9bb0: 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c   (nPayload<<7) |
9bc0: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
9bd0: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
9be0: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
9bf0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9c00: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
9c10: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
9c20: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9c30: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
9c40: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
9c50: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
9c60: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
9c70: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
9c80: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
9c90: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9ca0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9cb0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
9cc0: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
9cd0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
9ce0: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
9cf0: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
9d00: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
9d10: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
9d20: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
9d30: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
9d40: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
9d50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
9d60: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
9d70: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
9d80: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
9d90: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
9da0: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
9db0: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
9dc0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9dd0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
9de0: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
9df0: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
9e00: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
9e10: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
9e20: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
9e30: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9e40: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
9e50: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9e60: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9e70: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
9e80: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
9e90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
9ea0: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
9eb0: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
9ec0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9ed0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9ee0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9ef0: 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e   */.){.  pPage->
9f00: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
9f10: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
9f20: 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29  , iCell), pInfo)
9f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
9f40: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
9f50: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
9f60: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
9f70: 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a  Page.xCellSize.*
9f80: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
9f90: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
9fa0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
9fb0: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
9fc0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
9fd0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
9fe0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
9ff0: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
a000: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
a010: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
a020: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
a030: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
a040: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
a050: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
a060: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
a070: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
a080: 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  *.** cellSizePtr
a090: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d  NoPayload()    =
a0a0: 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e  >   table intern
a0b0: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c  al nodes.** cell
a0c0: 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20  SizePtr()       
a0d0: 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69        =>   all i
a0e0: 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62  ndex nodes & tab
a0f0: 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f  le leaf nodes.*/
a100: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
a110: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
a120: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
a130: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
a140: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
a150: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f  >childPtrSize; /
a160: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
a170: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
a180: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1b0: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
a1c0: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33  a varint */.  u3
a1d0: 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  2 nSize;        
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76         /* Size v
a200: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
a210: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a220: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
a230: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
a240: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a250: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
a260: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
a270: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
a280: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
a290: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
a2a0: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
a2b0: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
a2c0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
a2d0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
a2e0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
a2f0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
a300: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
a310: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a320: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a330: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a340: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a350: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a360: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a370: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
a380: 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a  dif..  nSize = *
a390: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69  pIter;.  if( nSi
a3a0: 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ze>=0x80 ){.    
a3b0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
a3c0: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30  ;.    nSize &= 0
a3d0: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
a3e0: 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a     nSize = (nSiz
a3f0: 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  e<<7) | (*++pIte
a400: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
a410: 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e  while( *(pIter)>
a420: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
a430: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
a440: 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67  er++;.  if( pPag
a450: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
a460: 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f   /* pIter now po
a470: 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62  ints at the 64-b
a480: 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76  it integer key v
a490: 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65  alue, a variable
a4a0: 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20   length .    ** 
a4b0: 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c  integer. The fol
a4c0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76  lowing block mov
a4d0: 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  es pIter to poin
a4e0: 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  t at the first b
a4f0: 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  yte.    ** past 
a500: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b  the end of the k
a510: 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  ey value. */.   
a520: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
a530: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
a540: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
a550: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
a560: 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e   }.  testcase( n
a570: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a580: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a590: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
a5a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a5b0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50  .  if( nSize<=pP
a5c0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
a5d0: 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75  .    nSize += (u
a5e0: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
a5f0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  l);.    if( nSiz
a600: 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b  e<4 ) nSize = 4;
a610: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
a620: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
a630: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
a640: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
a650: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
a660: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
a670: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
a680: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
a690: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
a6a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
a6b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
a6c0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a6d0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
a6e0: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
a6f0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
a700: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
a710: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
a720: 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28  ze += 4 + (u16)(
a730: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a740: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53    }.  assert( nS
a750: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
a760: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
a770: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
a780: 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61  u16)nSize;.}.sta
a790: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
a7a0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d  PtrNoPayload(Mem
a7b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
a7c0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
a7d0: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34  Iter = pCell + 4
a7e0: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
a7f0: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
a800: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
a810: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
a820: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
a830: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69   a varint */..#i
a840: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a850: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
a860: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
a870: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
a880: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
a890: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
a8a0: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
a8b0: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
a8c0: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
a8d0: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
a8e0: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
a8f0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
a900: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
a910: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
a920: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
a930: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
a940: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
a950: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
a960: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
a970: 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65  buginfo;.  pPage
a980: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
a990: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
a9a0: 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  ginfo);.#else.  
a9b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a9c0: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
a9d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a9e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
a9f0: 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49  4 );.  pEnd = pI
aa00: 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65  ter + 9;.  while
aa10: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
aa20: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
aa30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 62  );.  assert( deb
aa40: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75  uginfo.nSize==(u
aa50: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
aa60: 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  l) || CORRUPT_DB
aa70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
aa80: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
aa90: 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  );.}...#ifdef SQ
aaa0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
aab0: 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20  is variation on 
aac0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73  cellSizePtr() is
aad0: 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20   used inside of 
aae0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
aaf0: 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a  nts.** only. */.
ab00: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
ab10: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
ab20: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
ab30: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
ab40: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
ab50: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
ab60: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
ab70: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
ab80: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ab90: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
aba0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
abb0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
abc0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
abd0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
abe0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
abf0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
ac00: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
ac10: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
ac20: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
ac30: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
ac40: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
ac50: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
ac60: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
ac70: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
ac80: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
ac90: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
aca0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61  Cell!=0 );.  pPa
acb0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
acc0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
acd0: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
ace0: 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79  nLocal<info.nPay
acf0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f  load ){.    Pgno
ad00: 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
ad10: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69  (&pCell[info.nSi
ad20: 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d  ze-4]);.    ptrm
ad30: 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
ad40: 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  , ovfl, PTRMAP_O
ad50: 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
ad60: 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d  >pgno, pRC);.  }
ad70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
ad80: 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65  * Defragment the
ad90: 20 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69   page given. Thi
ada0: 73 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61  s routine reorga
adb0: 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68  nizes cells with
adc0: 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73  in the.** page s
add0: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
ade0: 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20   no free-blocks 
adf0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63  on the free-bloc
ae00: 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61  k list..**.** Pa
ae10: 72 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67  rameter nMaxFrag
ae20: 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
ae30: 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65  amount of fragme
ae40: 6e 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20  nted space that 
ae50: 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e  may be.** presen
ae60: 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66  t in the page af
ae70: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
ae80: 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
ae90: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
aea0: 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74  4582-60138 SQLit
aeb0: 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20  e may from time 
aec0: 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69  to time reorgani
aed0: 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ze a.** b-tree p
aee0: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
aef0: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f  e are no freeblo
af00: 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20  cks or fragment 
af10: 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e  bytes, all.** un
af20: 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63  used bytes are c
af30: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
af40: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  unallocated spac
af50: 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c  e region, and al
af60: 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70  l.** cells are p
af70: 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74  acked tightly at
af80: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
af90: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
afa0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
afb0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
afc0: 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29  e, int nMaxFrag)
afd0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aff0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
b000: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b020: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
b030: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
b040: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
b050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
b060: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
b070: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
b080: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
b090: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b0a0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
b0b0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
b0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b0d0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
b0e0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
b0f0: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
b100: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b110: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b120: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
b130: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b160: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b170: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
b180: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
b190: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b1a0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
b1b0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
b1c0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
b1d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
b1e0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
b1f0: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
b200: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
b210: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
b220: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
b230: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
b240: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
b250: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
b260: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
b270: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b280: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
b290: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
b2a0: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
b2b0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
b2c0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
b2d0: 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  x */..  assert( 
b2e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
b2f0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
b300: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b310: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
b320: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b330: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b340: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
b350: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
b360: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
b370: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
b380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b390: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b3a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b3b0: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30  x) );.  temp = 0
b3c0: 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d  ;.  src = data =
b3d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b3e0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b3f0: 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f  rOffset;.  cellO
b400: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
b410: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65  ellOffset;.  nCe
b420: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
b430: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  l;.  assert( nCe
b440: 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  ll==get2byte(&da
b450: 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20  ta[hdr+3]) );.  
b460: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
b470: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
b480: 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  l;.  usableSize 
b490: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
b4a0: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  ableSize;..  /* 
b4b0: 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c  This block handl
b4c0: 65 73 20 70 61 67 65 73 20 77 69 74 68 20 74 77  es pages with tw
b4d0: 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65 65 20  o or fewer free 
b4e0: 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46  blocks and nMaxF
b4f0: 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65  rag.  ** or fewe
b500: 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  r fragmented byt
b510: 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  es. In this case
b520: 20 69 74 20 69 73 20 66 61 73 74 65 72 20 74 6f   it is faster to
b530: 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74   move the.  ** t
b540: 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63  wo (or one) bloc
b550: 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e  ks of cells usin
b560: 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20  g memmove() and 
b570: 61 64 64 20 74 68 65 20 72 65 71 75 69 72 65 64  add the required
b580: 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f  .  ** offsets to
b590: 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e   each pointer in
b5a0: 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
b5b0: 72 20 61 72 72 61 79 20 74 68 61 6e 20 69 74 20  r array than it 
b5c0: 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f  is to .  ** reco
b5d0: 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74 69  nstruct the enti
b5e0: 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69  re page.  */.  i
b5f0: 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72  f( (int)data[hdr
b600: 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b  +7]<=nMaxFrag ){
b610: 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d  .    int iFree =
b620: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b630: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+1]);.    if(
b640: 20 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   iFree ){.      
b650: 69 6e 74 20 69 46 72 65 65 32 20 3d 20 67 65 74  int iFree2 = get
b660: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b670: 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70  e]);..      /* p
b680: 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 68 61  ageFindSlot() ha
b690: 73 20 61 6c 72 65 61 64 79 20 76 65 72 69 66 69  s already verifi
b6a0: 65 64 20 74 68 61 74 20 66 72 65 65 20 62 6c 6f  ed that free blo
b6b0: 63 6b 73 20 61 72 65 20 73 6f 72 74 65 64 0a 20  cks are sorted. 
b6c0: 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65 72       ** in order
b6d0: 20 6f 66 20 6f 66 66 73 65 74 20 77 69 74 68 69   of offset withi
b6e0: 6e 20 74 68 65 20 70 61 67 65 2c 20 61 6e 64 20  n the page, and 
b6f0: 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65 78  that no block ex
b700: 74 65 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20 70  tends.      ** p
b710: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
b720: 68 65 20 70 61 67 65 2e 20 50 72 6f 76 69 64 65  he page. Provide
b730: 64 20 74 68 65 20 74 77 6f 20 66 72 65 65 20 73  d the two free s
b740: 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20 20  lots do not .   
b750: 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20 74     ** overlap, t
b760: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
b770: 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65 28  hat the memmove(
b780: 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77 69  ) calls below wi
b790: 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  ll not.      ** 
b7a0: 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 75 73  overwrite the us
b7b0: 61 62 6c 65 53 69 7a 65 20 62 79 74 65 20 62 75  ableSize byte bu
b7c0: 66 66 65 72 2c 20 65 76 65 6e 20 69 66 20 74 68  ffer, even if th
b7d0: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 0a  e database page.
b7e0: 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 72 72        ** is corr
b7f0: 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  upt.  */.      a
b800: 73 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30  ssert( iFree2==0
b810: 20 7c 7c 20 69 46 72 65 65 32 3e 69 46 72 65 65   || iFree2>iFree
b820: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b830: 28 20 69 46 72 65 65 2b 67 65 74 32 62 79 74 65  ( iFree+get2byte
b840: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29  (&data[iFree+2])
b850: 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29   <= usableSize )
b860: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b870: 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72  iFree2==0 || iFr
b880: 65 65 32 2b 67 65 74 32 62 79 74 65 28 26 64 61  ee2+get2byte(&da
b890: 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c 3d  ta[iFree2+2]) <=
b8a0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a   usableSize );..
b8b0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72        if( 0==iFr
b8c0: 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72  ee2 || (data[iFr
b8d0: 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b  ee2]==0 && data[
b8e0: 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b  iFree2+1]==0) ){
b8f0: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e  .        u8 *pEn
b900: 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  d = &data[cellOf
b910: 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b  fset + nCell*2];
b920: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41 64  .        u8 *pAd
b930: 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dr;.        int 
b940: 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sz2 = 0;.       
b950: 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79   int sz = get2by
b960: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32  te(&data[iFree+2
b970: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ]);.        int 
b980: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
b990: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b9a0: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32        if( iFree2
b9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
b9c0: 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72 65 65  ( iFree+sz>iFree
b9d0: 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  2 ) return SQLIT
b9e0: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
b9f0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
ba00: 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74         sz2 = get
ba10: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
ba20: 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  e2+2]);.        
ba30: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 2b    assert( iFree+
ba40: 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32 2d 28 69  sz+sz2+iFree2-(i
ba50: 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62  Free+sz) <= usab
ba60: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
ba70: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
ba80: 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c  a[iFree+sz+sz2],
ba90: 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d   &data[iFree+sz]
baa0: 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  , iFree2-(iFree+
bab0: 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sz));.          
bac0: 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20  sz += sz2;.     
bad0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72     }.        cbr
bae0: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
baf0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
bb00: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
bb10: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
bb20: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
bb30: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
bb40: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
bb50: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
bb60: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
bb70: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
bb80: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
bb90: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
bba0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
bbb0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
bbc0: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
bbd0: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
bbe0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
bbf0: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
bc00: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
bc10: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
bc20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bc30: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
bc40: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
bc50: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
bc60: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
bc70: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
bc80: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
bc90: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
bca0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
bcb0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
bcc0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
bcd0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
bce0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
bcf0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
bd00: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
bd10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
bd20: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
bd30: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
bd40: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
bd50: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
bd60: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
bd70: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
bd80: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
bd90: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
bda0: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
bdb0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
bdc0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
bdd0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
bde0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
bdf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
be00: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
be10: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
be20: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  }.    assert( pc
be30: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20  >=iCellFirst && 
be40: 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc<=iCellLast );
be50: 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67  .    size = pPag
be60: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
be70: 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20  ge, &src[pc]);. 
be80: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
be90: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
bea0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73  ellFirst || pc+s
beb0: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
bec0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
bed0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
bee0: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
bef0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
bf00: 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73  t( cbrk+size<=us
bf10: 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b  ableSize && cbrk
bf20: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
bf30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62      testcase( cb
bf40: 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  rk+size==usableS
bf50: 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ize );.    testc
bf60: 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73  ase( pc+size==us
bf70: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
bf80: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
bf90: 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74  cbrk);.    if( t
bfa0: 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
bfb0: 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28  int x;.      if(
bfc0: 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74   cbrk==pc ) cont
bfd0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70  inue;.      temp
bfe0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
bff0: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
c000: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
c010: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
c020: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c030: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65        memcpy(&te
c040: 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c  mp[x], &data[x],
c050: 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78   (cbrk+size) - x
c060: 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74  );.      src = t
c070: 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  emp;.    }.    m
c080: 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b  emcpy(&data[cbrk
c090: 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a  ], &src[pc], siz
c0a0: 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  e);.  }.  data[h
c0b0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66  dr+7] = 0;.. def
c0c0: 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69  ragment_out:.  i
c0d0: 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63  f( data[hdr+7]+c
c0e0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
c0f0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
c100: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c110: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
c120: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
c130: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
c140: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
c150: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c160: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
c170: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
c180: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
c190: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
c1a0: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
c1b0: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
c1c0: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
c1d0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
c1e0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
c1f0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
c200: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c210: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
c220: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20  he free-list on 
c230: 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61  page pPg for spa
c240: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65  ce to store a ce
c250: 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69  ll nByte bytes i
c260: 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e  n.** size. If on
c270: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  e can be found, 
c280: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
c290: 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e   to the space an
c2a0: 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66  d remove it.** f
c2b0: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
c2c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73  t..**.** If no s
c2d0: 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61  uitable space ca
c2e0: 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68  n be found on th
c2f0: 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74  e free-list, ret
c300: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
c310: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
c320: 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74  y detect corrupt
c330: 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20  ion within pPg. 
c340: 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69   If corruption i
c350: 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68  s.** detected th
c360: 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  en *pRc is set t
c370: 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  o SQLITE_CORRUPT
c380: 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74   and NULL is ret
c390: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f  urned..**.** Slo
c3a0: 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ts on the free l
c3b0: 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65 74  ist that are bet
c3c0: 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74  ween 1 and 3 byt
c3d0: 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  es larger than n
c3e0: 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  Byte.** will be 
c3f0: 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e  ignored if addin
c400: 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61 63  g the extra spac
c410: 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e  e to the fragmen
c420: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20  tation count.** 
c430: 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67 6d  causes the fragm
c440: 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74  entation count t
c450: 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a  o exceed 60..*/.
c460: 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46  static u8 *pageF
c470: 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20  indSlot(MemPage 
c480: 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c  *pPg, int nByte,
c490: 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f   int *pRc){.  co
c4a0: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
c4b0: 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  g->hdrOffset;.  
c4c0: 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
c4d0: 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
c4e0: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72   int iAddr = hdr
c4f0: 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d   + 1;.  int pc =
c500: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
c510: 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20  [iAddr]);.  int 
c520: 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  x;.  int usableS
c530: 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e  ize = pPg->pBt->
c540: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61  usableSize;..  a
c550: 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20  ssert( pc>0 );. 
c560: 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a   do{.    int siz
c570: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
c580: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
c590: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a  e slot */.    /*
c5a0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c5b0: 30 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65  06866-39125 Free
c5c0: 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79  blocks are alway
c5d0: 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f  s connected in o
c5e0: 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69  rder of.    ** i
c5f0: 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74  ncreasing offset
c600: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e  . */.    if( pc>
c610: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20  usableSize-4 || 
c620: 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20  pc<iAddr+4 ){.  
c630: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
c640: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
c650: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
c660: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
c670: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
c680: 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33  -OF: R-22710-533
c690: 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64  28 The third and
c6a0: 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66   fourth bytes of
c6b0: 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65   each.    ** fre
c6c0: 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69  eblock form a bi
c6d0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
c6e0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69   which is the si
c6f0: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c  ze of the freebl
c700: 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79  ock.    ** in by
c710: 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  tes, including t
c720: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
c730: 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20  . */.    size = 
c740: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
c750: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
c760: 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74  (x = size - nByt
c770: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  e)>=0 ){.      t
c780: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
c790: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c7a0: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69   x==3 );.      i
c7b0: 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c  f( pc < pPg->cel
c7c0: 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e  lOffset+2*pPg->n
c7d0: 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20  Cell || size+pc 
c7e0: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
c7f0: 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53          *pRc = S
c800: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
c810: 4e 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  NO(pPg->pgno);. 
c820: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
c830: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
c840: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
c850: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
c860: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
c870: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
c880: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
c890: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
c8a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c8b0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
c8c0: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
c8d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
c8e0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
c8f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
c900: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
c910: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
c920: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
c930: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
c940: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
c950: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
c960: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
c970: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
c980: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
c990: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
c9a0: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
c9b0: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
c9c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c9d0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
c9e0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
c9f0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
ca00: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
ca10: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
ca20: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
ca30: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
ca40: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
ca50: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
ca60: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
ca70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ca80: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
ca90: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
caa0: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
cab0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
cac0: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77  aData[pc]);.  }w
cad0: 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72  hile( pc );..  r
cae0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
caf0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
cb00: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
cb10: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
cb20: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
cb30: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
cb40: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
cb50: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
cb60: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
cb70: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
cb80: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
cb90: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
cba0: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
cbb0: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
cbc0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
cbd0: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
cbe0: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
cbf0: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
cc00: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
cc10: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
cc20: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
cc30: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
cc40: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
cc50: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
cc60: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
cc70: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
cc80: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
cc90: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
cca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ccb0: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
ccc0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
ccd0: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
cce0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
ccf0: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
cd00: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
cd10: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
cd20: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
cd30: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
cd40: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
cd50: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
cd60: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
cd70: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
cd80: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
cd90: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
cda0: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
cdb0: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
cdc0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
cdd0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
cde0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
cdf0: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
ce00: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
ce10: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
ce20: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
ce30: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
ce40: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
ce50: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
ce80: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
ce90: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
cea0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ceb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cec0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
ced0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
cee0: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
cef0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
cf00: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
cf10: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
cf20: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
cf30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cf40: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
cf50: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
cf60: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
cf70: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
cf80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cf90: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
cfa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
cfb0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
cfc0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
cfd0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
cfe0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
cff0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
d000: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
d010: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
d020: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
d030: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
d040: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
d050: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
d060: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
d070: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
d080: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
d090: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
d0a0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
d0b0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
d0c0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
d0d0: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
d0e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d0f0: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
d100: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
d110: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
d120: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
d130: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
d140: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
d150: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
d160: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
d170: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
d180: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
d190: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
d1a0: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
d1b0: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
d1c0: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
d1d0: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
d1e0: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
d1f0: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
d200: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
d210: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
d220: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
d230: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
d240: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d250: 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74  dr+5]);.  assert
d260: 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67  ( top<=(int)pPag
d270: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d280: 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74  ze ); /* Prevent
d290: 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61   by getAndInitPa
d2a0: 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61  ge() */.  if( ga
d2b0: 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  p>top ){.    if(
d2c0: 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65   top==0 && pPage
d2d0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d2e0: 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20  e==65536 ){.    
d2f0: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
d300: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d320: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
d330: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
d340: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
d350: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
d360: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
d370: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
d380: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
d390: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
d3a0: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
d3b0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
d3c0: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
d3d0: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
d3e0: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
d3f0: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
d400: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
d410: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
d420: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
d430: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
d440: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d450: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
d460: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
d470: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
d480: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
d490: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
d4a0: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
d4b0: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
d4c0: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
d4d0: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
d4e0: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
d4f0: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
d500: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
d510: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
d520: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
d530: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
d540: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
d550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d560: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
d570: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
d580: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
d590: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
d5a0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
d5b0: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
d5c0: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
d5d0: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
d5e0: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
d5f0: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
d600: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
d610: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
d620: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
d630: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
d640: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
d650: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
d660: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
d670: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
d680: 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28  Page(pPage, MIN(
d690: 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  4, pPage->nFree 
d6a0: 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20  - (2+nByte)));. 
d6b0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
d6c0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
d6d0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
d6e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
d6f0: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
d700: 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  2+nByte<=top );.
d710: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
d720: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
d730: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
d740: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
d750: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
d760: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
d770: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
d780: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
d790: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
d7a0: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
d7b0: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
d7c0: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
d7d0: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
d7e0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
d7f0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
d800: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
d810: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
d820: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
d830: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
d840: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
d850: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
d860: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
d870: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
d880: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d890: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
d8a0: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
d8b0: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
d8c0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
d8d0: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
d8e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d8f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
d900: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
d910: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
d920: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
d930: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
d940: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
d950: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
d960: 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d  e->aData[iStart]
d970: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
d980: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
d990: 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a   iSize bytes..**
d9a0: 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65  .** Adjacent fre
d9b0: 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c  eblocks are coal
d9c0: 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  esced..**.** Not
d9d0: 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
d9e0: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
d9f0: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
da00: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
da10: 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ge(),.** that ro
da20: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
da30: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
da40: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
da50: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
da60: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
da70: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
da80: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
da90: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
daa0: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
dab0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
dac0: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
dad0: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
dae0: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
daf0: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
db00: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
db10: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
db20: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
db30: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
db40: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
db50: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
db60: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
db70: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
db80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dba0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
dbb0: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
dbc0: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
dbd0: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbf0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
dc00: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
dc10: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
dc40: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
dc50: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
dc60: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
dc90: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
dca0: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
dcb0: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcd0: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
dce0: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32  f iSize */.  u32
dcf0: 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e   iLast = pPage->
dd00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
dd10: 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f  4; /* Largest po
dd20: 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b  ssible freeblock
dd30: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32   offset */.  u32
dd40: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
dd50: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
dd60: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
dd70: 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74   past the iStart
dd80: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73   buffer */.  uns
dd90: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
dda0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
ddb0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65     /* Page conte
ddc0: 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
ddd0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
dde0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ddf0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
de00: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
de10: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
de20: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
de30: 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  Start>=pPage->hd
de40: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
de50: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
de60: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
de70: 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d  PT_DB || iEnd <=
de80: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
de90: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
dea0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
deb0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
dec0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
ded0: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
dee0: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
def0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
df00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
df10: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20  art<=iLast );.. 
df20: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
df30: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
df40: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
df50: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
df60: 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  ete.  ** option 
df70: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
df80: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
df90: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
dfa0: 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
dfb0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
dfc0: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
dfd0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
dfe0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
dff0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
e000: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
e010: 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20   Find the .  ** 
e020: 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  spot on the list
e030: 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68   where iStart sh
e040: 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
e050: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
e060: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
e070: 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20  .  iPtr = hdr + 
e080: 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50  1;.  if( data[iP
e090: 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61  tr+1]==0 && data
e0a0: 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iPtr]==0 ){.   
e0b0: 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20   iFreeBlk = 0;  
e0c0: 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
e0d0: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
e0e0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
e0f0: 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  pty */.  }else{.
e100: 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65      while( (iFre
e110: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
e120: 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53  &data[iPtr]))<iS
e130: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
e140: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
e150: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  4 ){.        if(
e160: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62   iFreeBlk==0 ) b
e170: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65  reak;.        re
e180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e190: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
e1a0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
e1b0: 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65       iPtr = iFre
e1c0: 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eBlk;.    }.    
e1d0: 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61  if( iFreeBlk>iLa
e1e0: 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  st ) return SQLI
e1f0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
e200: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
e210: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
e220: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
e230: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
e240: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e250: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
e260: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
e270: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
e280: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
e290: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
e2a0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
e2b0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
e2c0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
e2d0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
e2e0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
e2f0: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
e300: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
e310: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
e320: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
e330: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
e340: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
e350: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
e360: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
e370: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
e380: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
e390: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e3a0: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
e3b0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 45 6e 64  gno);.      iEnd
e3c0: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65   = iFreeBlk + ge
e3d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
e3e0: 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20  eeBlk+2]);.     
e3f0: 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67   if( iEnd > pPag
e400: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
e410: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ze ){.        re
e420: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e430: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
e440: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
e450: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
e460: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
e470: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
e480: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
e490: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
e4a0: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
e4b0: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
e4c0: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
e4d0: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
e4e0: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
e4f0: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
e500: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
e510: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
e520: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
e530: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
e540: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
e550: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
e560: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
e570: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
e580: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
e590: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
e5a0: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
e5b0: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
e5c0: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
e5d0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
e5e0: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
e5f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
e600: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
e610: 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b  .        nFrag +
e620: 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45  = iStart - iPtrE
e630: 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a  nd;.        iSiz
e640: 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b  e = iEnd - iPtr;
e650: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
e660: 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a  = iPtr;.      }.
e670: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
e680: 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20  rag>data[hdr+7] 
e690: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e6a0: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
e6b0: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 64  ge->pgno);.    d
e6c0: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
e6d0: 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  rag;.  }.  if( i
e6e0: 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28  Start==get2byte(
e6f0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b  &data[hdr+5]) ){
e700: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
e710: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20  freeblock is at 
e720: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
e730: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
e740: 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73  t area,.    ** s
e750: 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68  o just extend th
e760: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
e770: 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20  rea rather than 
e780: 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20  create another. 
e790: 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65     ** freelist e
e7a0: 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  ntry */.    if( 
e7b0: 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
e7c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e7d0: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
e7e0: 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74 32 62  pgno);.    put2b
e7f0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
e800: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
e810: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
e820: 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
e830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
e840: 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
e850: 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
e860: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
e870: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
e880: 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
e890: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
e8a0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
e8b0: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
e8c0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
e8d0: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  +2], iSize);.  }
e8e0: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
e8f0: 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20  += iOrigSize;.  
e900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
e920: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
e930: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
e940: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
e950: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
e960: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
e970: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
e980: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
e990: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
e9a0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
e9b0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
e9c0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
e9d0: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
e9e0: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
e9f0: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
ea00: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
ea10: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
ea20: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
ea30: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
ea40: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
ea50: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
ea60: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
ea70: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
ea80: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
ea90: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
eaa0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
eab0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
eac0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
ead0: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
eae0: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
eaf0: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
eb00: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
eb10: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
eb20: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
eb30: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
eb40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
eb50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
eb60: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
eb70: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
eb80: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
eb90: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
eba0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
ebb0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
ebc0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
ebd0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
ebe0: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
ebf0: 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78  leaf;.  pPage->x
ec00: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
ec10: 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20  izePtr;.  pBt = 
ec20: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
ec30: 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46  ( flagByte==(PTF
ec40: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ec50: 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f  INTKEY) ){.    /
ec60: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
ec70: 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41 20 76  -07291-35328 A v
ec80: 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35 29  alue of 5 (0x05)
ec90: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
eca0: 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74  is an.    ** int
ecb0: 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72  erior table b-tr
ecc0: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
ecd0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
ece0: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
ecf0: 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==5 );.    /* E
ed00: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36  VIDENCE-OF: R-26
ed10: 39 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75  900-09176 A valu
ed20: 65 20 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d  e of 13 (0x0d) m
ed30: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
ed40: 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74   a.    ** leaf t
ed50: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
ed60: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ed70: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
ed80: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
ed90: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
eda0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
edb0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
edc0: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
edd0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
ede0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
edf0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
ee00: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
ee10: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
ee20: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
ee30: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  yLeaf = 0;.     
ee40: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
ee50: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  e = cellSizePtrN
ee60: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20  oPayload;.      
ee70: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
ee80: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
ee90: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  llPtrNoPayload;.
eea0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
eeb0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
eec0: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
eed0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
eee0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
eef0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
ef00: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
ef10: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
ef20: 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d  NCE-OF: R-43316-
ef30: 33 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66  37308 A value of
ef40: 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20   2 (0x02) means 
ef50: 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20  the page is an. 
ef60: 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69     ** interior i
ef70: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
ef80: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ef90: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d   (PTF_ZERODATA)=
efa0: 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =2 );.    /* EVI
efb0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31  DENCE-OF: R-5961
efc0: 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65 20  5-42828 A value 
efd0: 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d 65 61  of 10 (0x0a) mea
efe0: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
eff0: 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64  .    ** leaf ind
f000: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
f010: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
f020: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
f030: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
f040: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
f050: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
f060: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
f070: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
f080: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
f090: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a  seCellPtrIndex;.
f0a0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
f0b0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
f0c0: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
f0d0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
f0e0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
f0f0: 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  e{.    /* EVIDEN
f100: 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35  CE-OF: R-47608-5
f110: 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76  6469 Any other v
f120: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74  alue for the b-t
f130: 72 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73  ree page type is
f140: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
f150: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
f160: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
f170: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
f180: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
f190: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
f1a0: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
f1b0: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
f1c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f1d0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
f1e0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
f1f0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
f200: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
f210: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
f220: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
f230: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
f240: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
f250: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
f260: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
f270: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
f280: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
f290: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
f2a0: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
f2b0: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
f2c0: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
f2d0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
f2e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
f2f0: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
f300: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
f310: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
f320: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
f330: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
f340: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
f350: 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20  ge){.  int pc;  
f360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
f370: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
f380: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
f390: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  ->aData[] */.  u
f3a0: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
f3b0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
f3c0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
f3d0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20   header */.  u8 
f3e0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
f3f0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
f400: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74  e->aData */.  Bt
f410: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
f420: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
f430: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
f440: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
f450: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
f460: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
f470: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
f480: 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73  /.  u16 cellOffs
f490: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
f4a0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
f4b0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
f4c0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
f4d0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
f4e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
f4f0: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
f500: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  he page */.  int
f510: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
f520: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
f530: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
f540: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
f550: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
f560: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
f570: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
f580: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
f590: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
f5a0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
f5b0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
f5c0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
f5d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f5e0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
f5f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
f600: 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
f610: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f620: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
f630: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f640: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
f650: 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
f660: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
f670: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
f680: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d   assert( pPage =
f690: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
f6a0: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
f6b0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
f6c0: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
f6d0: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
f6e0: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
f6f0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
f700: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
f710: 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20  it==0 );..  pBt 
f720: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
f730: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
f740: 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
f750: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
f760: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f770: 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54   R-28594-02890 T
f780: 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67  he one-byte flag
f790: 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64   at offset 0 ind
f7a0: 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  icating.  ** the
f7b0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
f7c0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f  e. */.  if( deco
f7d0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
f7e0: 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20 20  ata[hdr]) ){.   
f7f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f800: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
f810: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  e->pgno);.  }.  
f820: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
f830: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
f840: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
f850: 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
f860: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
f870: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f880: 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  1);.  pPage->nOv
f890: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75 73  erflow = 0;.  us
f8a0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
f8b0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50  usableSize;.  pP
f8c0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
f8d0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
f8e0: 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e  dr + 8 + pPage->
f8f0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
f900: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
f910: 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69  = &data[usableSi
f920: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
f930: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63  ellIdx = &data[c
f940: 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70 50  ellOffset];.  pP
f950: 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
f960: 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
f970: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 2f  ildPtrSize];.  /
f980: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f990: 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65  -58015-48175 The
f9a0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
f9b0: 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65  r at offset 5 de
f9c0: 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68  signates.  ** th
f9d0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
f9e0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
f9f0: 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66  . A zero value f
fa00: 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20  or this integer 
fa10: 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65  is.  ** interpre
fa20: 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f  ted as 65536. */
fa30: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
fa40: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
fa50: 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56 49  dr+5]);.  /* EVI
fa60: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
fa70: 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
fa80: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
fa90: 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
faa0: 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  he.  ** number o
fab0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
fac0: 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d  age. */.  pPage-
fad0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
fae0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
faf0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
fb00: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
fb10: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
fb20: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
fb30: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
fb40: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
fb50: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
fb60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fb70: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
fb80: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74  gno);.  }.  test
fb90: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
fba0: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
fbb0: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
fbc0: 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
fbd0: 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
fbe0: 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
fbf0: 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
fc00: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
fc10: 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20   a root page of 
fc20: 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  a table that con
fc30: 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74  tains no rows) t
fc40: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66  hen the.  ** off
fc50: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
fc60: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c  content area wil
fc70: 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65  l equal the page
fc80: 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a   size minus the.
fc90: 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65    ** bytes of re
fca0: 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f  served space. */
fcb0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
fcc0: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
fcd0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
fce0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
fcf0: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
fd00: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
fd10: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
fd20: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
fd30: 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77  d.  ** of page w
fd40: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
fd50: 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ll.  .  **.  ** 
fd60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
fd70: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
fd80: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
fd90: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
fda0: 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20  s.  ** past the 
fdb0: 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
fdc0: 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
fdd0: 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
fde0: 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65 74   to be .  ** ret
fdf0: 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
fe00: 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69  ..  */.  iCellFi
fe10: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
fe20: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
fe30: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
fe40: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
fe50: 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e  .  if( pBt->db->
fe60: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
fe70: 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20  ellSizeCk ){.   
fe80: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
fe90: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
fea0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
feb0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  r array */.    i
fec0: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
fed0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
fee0: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21  ll */..    if( !
fef0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
ff00: 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66  ellLast--;.    f
ff10: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
ff20: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
ff30: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
ff40: 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63  eAligned(&data[c
ff50: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
ff60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ff70: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
ff80: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ff90: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
ffa0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
ffb0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
ffc0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
ffd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ffe0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
fff0: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
10000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a        }.      sz
10010 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
10020 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61  ize(pPage, &data
10030 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 74 65 73  [pc]);.      tes
10040 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
10050 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
10060 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62    if( pc+sz>usab
10070 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
10080 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10090 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
100a0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
100b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
100c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
100d0 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d  iCellLast++;.  }
100e0 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65    ..  /* Compute
100f0 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
10100 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
10110 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d  e.  ** EVIDENCE-
10120 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35  OF: R-23588-3445
10130 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  0 The two-byte i
10140 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
10150 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a   1 gives the.  *
10160 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66  * start of the f
10170 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f  irst freeblock o
10180 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69  n the page, or i
10190 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  s zero if there 
101a0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65  are no.  ** free
101b0 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20  blocks. */.  pc 
101c0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
101d0 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65  [hdr+1]);.  nFre
101e0 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
101f0 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20  + top;  /* Init 
10200 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65  nFree to non-fre
10210 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63  eblock free spac
10220 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20  e */.  if( pc>0 
10230 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c  ){.    u32 next,
10240 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70   size;.    if( p
10250 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  c<iCellFirst ){.
10260 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
10270 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32  E-OF: R-55530-52
10280 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  930 In a well-fo
10290 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
102a0 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20  , there will.   
102b0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
102c0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c  at least one cel
102d0 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  l before the fir
102e0 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20  st freeblock..  
102f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
10300 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10310 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
10320 67 6e 6f 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20  gno); .    }.   
10330 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
10340 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c     if( pc>iCellL
10350 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
10360 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20  * Freeblock off 
10370 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
10380 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
10390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
103a0 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
103b0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
103c0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
103d0 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
103e0 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
103f0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10400 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72 65  +2]);.      nFre
10410 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
10420 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
10430 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72  <=pc+size+3 ) br
10440 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  eak;.      pc = 
10450 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  next;.    }.    
10460 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20  if( next>0 ){.  
10470 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b      /* Freeblock
10480 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e   not in ascendin
10490 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
104a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
104b0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
104c0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
104d0 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e      if( pc+size>
104e0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73  (unsigned int)us
104f0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
10500 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c    /* Last freebl
10510 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74  ock extends past
10520 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20   page end */.   
10530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10540 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
10550 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
10560 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  }.  }..  /* At t
10570 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65  his point, nFree
10580 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   contains the su
10590 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20  m of the offset 
105a0 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
105b0 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
105c0 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
105d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
105e0 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
105f0 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f    ** the cell-co
10600 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74  ntent area. If t
10610 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74  his is greater t
10620 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73  han the usable-s
10630 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ize.  ** of the 
10640 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
10650 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
10660 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
10670 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76  k also.  ** serv
10680 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
10690 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
106a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
106b0 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
106c0 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
106d0 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
106e0 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
106f0 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  in the page..  *
10700 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73  /.  if( nFree>us
10710 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
10720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10730 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
10740 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 70  ->pgno);.  }.  p
10750 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
10760 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
10770 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61 67 65  lFirst);.  pPage
10780 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
10790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
107a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
107b0 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
107c0 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
107d0 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
107e0 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
107f0 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
10800 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
10810 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
10820 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
10830 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
10840 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
10850 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
10860 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
10870 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61  ;.  u8 hdr = pPa
10880 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
10890 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61   u16 first;..  a
108a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
108b0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
108c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
108d0 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
108e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
108f0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
10900 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
10910 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
10920 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10930 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
10940 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
10950 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
10960 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
10970 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
10980 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
10990 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
109a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
109b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
109c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
109d0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20  BTS_FAST_SECURE 
109e0 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
109f0 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
10a00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
10a10 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  dr);.  }.  data[
10a20 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
10a30 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
10a40 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f  r + ((flags&PTF_
10a50 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20  LEAF)==0 ? 12 : 
10a60 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  8);.  memset(&da
10a70 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
10a80 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
10a90 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
10aa0 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
10ab0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
10ac0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
10ad0 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
10ae0 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b  leSize - first);
10af0 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
10b00 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
10b10 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
10b20 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
10b30 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
10b40 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
10b50 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
10b60 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
10b70 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
10b80 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64  ->aDataOfst = &d
10b90 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64  ata[pPage->child
10ba0 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  PtrSize];.  pPag
10bb0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
10bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
10bd0 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
10be0 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
10bf0 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
10c00 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
10c10 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
10c20 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
10c30 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
10c40 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
10c50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
10c60 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
10c70 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
10c80 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
10c90 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
10ca0 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
10cb0 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
10cc0 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
10cd0 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
10ce0 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
10cf0 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
10d00 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
10d10 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
10d20 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
10d30 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
10d40 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d  if( pgno!=pPage-
10d50 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
10d60 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
10d70 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
10d80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50  pDbPage);.    pP
10d90 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
10da0 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67  DbPage;.    pPag
10db0 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
10dc0 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
10dd0 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  pgno;.    pPage-
10de0 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e  >hdrOffset = pgn
10df0 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
10e00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
10e10 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69  age->aData==sqli
10e20 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
10e30 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
10e40 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
10e50 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
10e60 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
10e70 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
10e80 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
10e90 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
10ea0 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
10eb0 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a  eded.  See also:
10ec0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
10ed0 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
10ee0 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
10ef0 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20  CONTENT flag is 
10f00 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
10f10 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
10f20 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63  e.** about the c
10f30 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
10f40 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
10f50 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
10f60 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
10f70 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
10f80 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
10f90 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
10fa0 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
10fb0 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
10fc0 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
10fd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
10fe0 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
10ff0 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
11000 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
11010 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
11020 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
11030 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
11040 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
11050 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
11060 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
11070 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
11080 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
11090 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
110a0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
110b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
110c0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
110d0 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
110e0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
110f0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
11100 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
11110 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
11120 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
11130 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
11140 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
11150 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
11160 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
11170 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
11180 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
11190 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
111a0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
111b0 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
111c0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
111d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
111e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
111f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
11200 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11210 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
11220 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
11230 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73  )&pDbPage, flags
11240 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
11250 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
11260 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
11270 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
11280 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
11290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
112a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
112b0 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
112c0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
112d0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
112e0 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
112f0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
11300 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
11310 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
11320 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
11330 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
11340 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
11350 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
11360 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
11370 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
11380 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
11390 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
113a0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
113b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
113c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
113d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
113e0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
113f0 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
11400 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
11410 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
11420 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
11430 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
11440 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
11450 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
11460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11470 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
11480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11490 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
114a0 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
114b0 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
114c0 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
114d0 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
114e0 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
114f0 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
11500 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
11510 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
11520 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
11530 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
11540 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11550 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
11560 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
11570 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
11580 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20  )&0x8000000)==0 
11590 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
115a0 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
115b0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
115c0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
115d0 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
115e0 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  alize it..**.** 
115f0 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20  If pCur!=0 then 
11600 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
11610 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72  g fetched as par
11620 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69  t of a moveToChi
11630 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44  ld().** call.  D
11640 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  o additional san
11650 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
11660 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
11670 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66   case..** And if
11680 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73   the fetch fails
11690 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
116a0 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43  ust decrement pC
116b0 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  ur->iPage..**.**
116c0 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74   The page is fet
116d0 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69  ched as read-wri
116e0 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69  te unless pCur i
116f0 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
11700 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s.** a read-only
11710 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
11720 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11730 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  s, then *ppPage 
11740 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
11750 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
11760 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
11770 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
11780 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
11790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
117a0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
117b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
117e0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
117f0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
11800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11810 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
11820 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
11830 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
11840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
11850 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
11860 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
11870 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63  /* Cursor to rec
118a0 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f  eive the page, o
118b0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
118c0 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  bReadOnly       
118d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
118e0 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
118f0 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  nly page */.){. 
11900 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
11910 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
11920 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11930 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11940 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11950 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50  ( pCur==0 || ppP
11960 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61  age==&pCur->apPa
11970 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
11980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
11990 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c  r==0 || bReadOnl
119a0 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65  y==pCur->curPage
119b0 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65  rFlags );.  asse
119c0 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
119d0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
119e0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
119f0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
11a00 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11a10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11a20 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
11a30 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
11a40 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
11a50 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
11a60 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
11a70 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
11a80 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , bReadOnly);.  
11a90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f  if( rc ){.    go
11aa0 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11ab0 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a  e_error;.  }.  *
11ac0 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  ppPage = (MemPag
11ad0 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
11ae0 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
11af0 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ;.  if( (*ppPage
11b00 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
11b10 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f      btreePageFro
11b20 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
11b30 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20   pgno, pBt);.   
11b40 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
11b50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11b60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
11b80 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
11b90 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65  );.      goto ge
11ba0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11bb0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
11bc0 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
11bd0 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
11be0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
11bf0 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  age)->aData==sql
11c00 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11c10 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  (pDbPage) );..  
11c20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20  /* If obtaining 
11c30 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72  a child page for
11c40 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75   a cursor, we mu
11c50 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74  st verify that t
11c60 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20  he page is.  ** 
11c70 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
11c80 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a  the root page. *
11c90 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20  /.  if( pCur && 
11ca0 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c  ((*ppPage)->nCel
11cb0 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  l<1 || (*ppPage)
11cc0 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
11cd0 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20  curIntKey) ){.  
11ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
11cf0 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29  RRUPT_PGNO(pgno)
11d00 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
11d10 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
11d20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
11d30 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
11d40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11d50 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61  K;..getAndInitPa
11d60 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20  ge_error:.  if( 
11d70 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61  pCur ) pCur->iPa
11d80 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65  ge--;.  testcase
11d90 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
11da0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
11db0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
11dc0 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
11dd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
11de0 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
11df0 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
11e00 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
11e10 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
11e20 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
11e30 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
11e40 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e  oid releasePageN
11e50 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  otNull(MemPage *
11e60 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
11e70 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
11e80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11e90 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
11ea0 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
11eb0 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
11ec0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
11ed0 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
11ee0 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
11ef0 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
11f00 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11f10 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
11f20 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
11f30 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
11f40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11f50 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11f60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
11f70 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
11f80 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
11f90 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69  DbPage);.}.stati
11fa0 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11fb0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11fc0 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
11fd0 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  ) releasePageNot
11fe0 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  Null(pPage);.}..
11ff0 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75  /*.** Get an unu
12000 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  sed page..**.** 
12010 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
12020 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67  like btreeGetPag
12030 65 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64  e() with the add
12040 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ition:.**.**   *
12050 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
12060 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20   already in use 
12070 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
12080 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74  urpose, immediat
12090 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65  ely.**      rele
120a0 61 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72  ase it and retur
120b0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52  n an SQLITE_CURR
120c0 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20  UPT error..**   
120d0 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  *  Make sure the
120e0 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20   isInit flag is 
120f0 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20  clear.*/.static 
12100 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73  int btreeGetUnus
12110 65 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  edPage(.  BtShar
12120 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
12130 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
12140 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
12150 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12160 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
12170 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
12180 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
12190 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
121a0 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
121b0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
121c0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
121d0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
121e0 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
121f0 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
12200 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65  .  int rc = btre
12210 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
12220 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
12230 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
12240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
12250 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
12260 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
12270 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
12280 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
12290 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
122a0 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
122b0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
122c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
122d0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
122e0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
122f0 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
12300 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
12310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12320 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  ;.}.../*.** Duri
12330 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
12340 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
12350 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
12360 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
12370 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
12380 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
12390 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
123a0 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
123b0 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
123c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
123d0 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
123e0 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
123f0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
12400 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
12410 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
12420 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
12430 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
12440 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
12450 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
12460 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
12470 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
12480 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
12490 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
124a0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
124b0 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
124c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
124d0 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
124e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
124f0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
12500 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
12510 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
12520 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
12530 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12540 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
12550 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
12560 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
12570 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
12580 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
12590 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
125a0 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
125b0 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
125c0 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
125d0 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
125e0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
125f0 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
12600 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
12610 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
12620 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
12630 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
12640 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
12650 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
12660 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
12670 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
12680 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
12690 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
126a0 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
126b0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
126c0 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
126d0 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
126e0 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
126f0 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
12700 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
12710 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
12720 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
12730 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
12740 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
12750 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
12760 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
12770 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
12780 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
12790 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
127a0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
127b0 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
127c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
127d0 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
127e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
127f0 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
12800 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12810 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
12820 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
12830 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
12840 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
12850 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
12860 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
12870 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
12880 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
12890 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
128a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
128b0 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
128c0 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
128d0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
128e0 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
128f0 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
12900 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
12910 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
12920 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
12930 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
12940 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
12950 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
12960 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
12970 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
12980 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
12990 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
129a0 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
129b0 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
129c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
129d0 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
129e0 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
129f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
12a00 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
12a10 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
12a20 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
12a30 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
12a40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
12a50 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
12a60 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
12a70 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
12a80 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
12a90 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
12aa0 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
12ab0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
12ac0 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
12ad0 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
12ae0 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
12af0 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
12b00 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
12b10 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
12b20 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
12b30 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
12b40 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12b50 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
12b60 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
12b70 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
12b80 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
12b90 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
12ba0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
12bb0 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
12bc0 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
12bd0 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
12be0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12bf0 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
12c00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
12c10 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
12c20 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
12c30 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
12c40 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
12c50 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12c60 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
12c70 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
12c80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12c90 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
12ca0 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
12cb0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
12cc0 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
12cd0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
12ce0 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
12cf0 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
12d00 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
12d10 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
12d20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
12d30 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
12d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
12d50 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
12d60 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
12d70 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
12d80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12d90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12da0 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
12db0 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
12dc0 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
12df0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
12e00 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
12e10 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
12e20 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
12e30 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
12e40 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
12e50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12e70 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
12e80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
12e90 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
12ec0 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
12ed0 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
12ee0 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
12ef0 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
12f00 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
12f10 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
12f20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
12f30 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
12f40 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
12f50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
12f60 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
12f70 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
12f80 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
12f90 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
12fa0 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
12fb0 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
12fc0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
12fd0 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
12fe0 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
12ff0 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
13000 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13010 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
13020 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
13030 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
13040 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
13050 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
13060 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
13070 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
130a0 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
130b0 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
130e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
130f0 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
13100 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
13110 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13120 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
13130 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13140 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
13150 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
13160 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
13170 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
13180 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
13190 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
131a0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
131b0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
131c0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
131d0 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
131e0 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
131f0 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
13200 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
13210 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
13220 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
13230 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
13240 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
13250 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
13260 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
13270 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
13280 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
13290 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
132a0 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
132b0 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
132c0 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
132d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
132e0 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
132f0 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
13300 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
13310 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
13320 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
13330 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
13340 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
13350 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
13360 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
13370 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
13380 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
13390 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
133a0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
133b0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
133c0 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
133d0 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
133e0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
133f0 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
13400 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
13410 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
13420 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
13430 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13440 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
13450 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
13460 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
13470 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
13480 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
13490 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
134a0 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
134b0 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
134c0 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
134d0 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
134e0 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
134f0 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
13500 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
13510 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
13520 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
13530 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
13540 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
13550 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
13560 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
13570 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
13580 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
13590 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
135a0 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
135b0 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
135c0 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
135d0 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
135e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
135f0 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
13600 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
13610 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
13620 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
13630 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
13640 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
13650 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
13660 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
13670 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
13680 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13690 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
136a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
136b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
136c0 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
136d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
136e0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
136f0 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
13700 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
13710 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13720 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
13730 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
13740 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
13770 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
13780 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
13790 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
137a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
137b0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
137c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
137d0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
137e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
137f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13800 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
13810 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
13820 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
13830 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
13840 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
13850 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
13860 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13870 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
13880 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
13890 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
138a0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
138b0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
138c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
138d0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
138e0 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
138f0 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
13900 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
13910 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
13920 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
13930 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
13940 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
13950 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
13960 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
13970 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
13980 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
13990 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
139a0 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
139b0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
139c0 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
139d0 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
139e0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
139f0 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
13a00 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
13a10 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
13a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
13a30 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
13a40 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
13a50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
13a60 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
13a70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
13a80 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
13a90 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13aa0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
13ab0 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
13ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13ad0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
13ae0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
13af0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13b00 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13b20 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
13b30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
13b40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
13b50 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
13b60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13b70 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
13b80 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
13b90 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
13ba0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13bc0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13bd0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13be0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13bf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
13c00 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
13c10 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13c20 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
13c30 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
13c40 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
13c50 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
13c60 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
13c70 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
13c80 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
13c90 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
13ca0 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
13cb0 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
13cc0 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
13cd0 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
13ce0 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
13cf0 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
13d00 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
13d10 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
13d20 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
13d30 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
13d40 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
13d50 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
13d60 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
13d70 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
13d80 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13d90 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
13da0 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
13db0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
13dc0 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
13dd0 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
13de0 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
13df0 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
13e00 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
13e10 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
13e20 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
13e30 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
13e40 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
13e50 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
13e60 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13e70 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
13e80 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
13e90 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
13ea0 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
13eb0 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
13ec0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13ed0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
13ee0 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
13ef0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
13f00 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
13f10 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
13f20 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
13f30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
13f40 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
13f50 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13f60 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
13f70 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
13f80 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
13f90 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65         sizeof(Me
13fc0 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76  mPage), flags, v
13fd0 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
13fe0 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
13ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14000 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14010 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
14020 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
14030 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
14040 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
14050 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
14060 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
14070 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
14080 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
14090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
140a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
140b0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
140c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
140d0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
140e0 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
140f0 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
14100 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
14110 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
14120 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
14130 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
14140 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
14150 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
14160 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
14170 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
14180 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
14190 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
141a0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
141b0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
141c0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
141d0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
141e0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
141f0 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  TE).    pBt->bts
14200 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
14210 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69  URE_DELETE;.#eli
14220 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14230 5f 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c  _FAST_SECURE_DEL
14240 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74  ETE).    pBt->bt
14250 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56  sFlags |= BTS_OV
14260 45 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  ERWRITE;.#endif.
14270 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
14280 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
14290 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
142a0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
142b0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
142c0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
142d0 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
142e0 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
142f0 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
14300 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
14310 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
14320 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14330 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
14340 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
14350 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
14360 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
14370 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
14380 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
14390 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
143a0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
143b0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
143c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
143d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
143e0 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
143f0 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
14400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14410 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14420 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
14430 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
14440 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
14450 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
14460 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
14470 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
14480 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
14490 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
144a0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
144b0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
144c0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
144d0 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
144e0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
144f0 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
14500 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
14510 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
14520 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
14530 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
14540 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
14550 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
14560 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
14570 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
14580 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
14590 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
145a0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
145b0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
145c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
145d0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
145e0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
145f0 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
14600 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
14610 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
14620 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
14630 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
14640 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
14650 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
14660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14670 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
14680 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
14690 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
146a0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
146b0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
146c0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
146d0 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
146e0 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
146f0 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
14700 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
14710 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
14720 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
14730 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
14740 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
14750 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14760 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
14770 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
14780 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14790 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
147a0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
147b0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
147c0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
147d0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
147e0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
147f0 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
14800 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
14810 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
14820 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14830 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
14840 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
14850 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
14860 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
14870 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
14880 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
14890 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
148a0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
148b0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
148c0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
148d0 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
148e0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
148f0 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
14900 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
14910 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
14920 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
14930 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14940 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
14950 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
14960 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
14970 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
14980 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
14990 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
149a0 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
149b0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
149c0 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
149d0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
149e0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
149f0 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54  red; ).      MUT
14a00 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
14a10 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
14a20 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
14a30 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
14a40 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
14a50 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
14a60 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
14a70 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
14a80 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
14a90 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
14aa0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
14ab0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
14ac0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
14ad0 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
14ae0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
14af0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14b00 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
14b10 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
14b20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14b30 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14b40 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
14b50 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
14b60 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
14b70 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14b80 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14b90 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
14ba0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14bb0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14bc0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
14bd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14be0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
14bf0 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
14c00 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
14c10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14c20 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
14c30 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
14c40 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
14c50 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
14c60 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
14c70 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
14c80 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
14c90 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
14ca0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
14cb0 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
14cc0 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
14cd0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
14ce0 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
14cf0 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
14d00 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
14d10 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
14d20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
14d30 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
14d40 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
14d50 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
14d60 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
14d70 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
14d80 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
14d90 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
14da0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
14db0 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
14dc0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
14dd0 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
14de0 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c  f( (uptr)p->pBt<
14df0 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20  (uptr)pSib->pBt 
14e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
14e10 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
14e20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
14e30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14e40 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
14e50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14e60 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
14e70 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
14e80 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78  (uptr)pSib->pNex
14e90 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e  t->pBt<(uptr)p->
14ea0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
14eb0 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
14ec0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14ed0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
14ee0 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
14ef0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
14f00 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
14f10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
14f20 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
14f30 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
14f40 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
14f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14f60 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
14f70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14f80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14f90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
14fa0 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
14fb0 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
14fc0 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
14fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14fe0 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
14ff0 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
15000 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
15010 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
15020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15030 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
15040 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15050 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
15060 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
15070 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
15080 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a   *pFile;..    /*
15090 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
150a0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
150b0 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
150c0 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
150d0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
150e0 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
150f0 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
15100 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
15110 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
15120 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
15130 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
15140 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
15150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15160 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
15170 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
15180 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15190 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
151a0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
151b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
151c0 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
151d0 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20   }..    pFile = 
151e0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
151f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15200 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d     if( pFile->pM
15210 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
15220 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
15230 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20  trolHint(pFile, 
15240 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42  SQLITE_FCNTL_PDB
15250 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64  , (void*)&pBt->d
15260 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
15270 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
15280 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
15290 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
152a0 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
152b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
152c0 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
152d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
152e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
152f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e   sqlite3BtreeCon
15300 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70  nectionCount(*pp
15310 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65  Btree)>0 );.  re
15320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15330 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
15340 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
15350 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
15360 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
15370 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
15380 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
15390 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
153a0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
153b0 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
153c0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
153d0 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
153e0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
153f0 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
15400 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
15410 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
15420 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
15430 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
15440 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15450 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15460 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
15470 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
15480 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
15490 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
154a0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
154b0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
154c0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
154d0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
154e0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
154f0 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
15500 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15510 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15520 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
15530 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
15540 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
15550 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
15560 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
15570 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
15580 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
15590 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
155a0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
155b0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
155c0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
155d0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
155e0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
155f0 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
15600 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15610 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15620 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
15630 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
15640 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
15650 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
15660 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
15670 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
15680 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
15690 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
156a0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
156b0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
156c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
156d0 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
156e0 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
156f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
15700 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
15710 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
15720 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
15730 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15740 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
15750 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
15760 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
15770 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
15780 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
15790 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
157a0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
157b0 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
157c0 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
157d0 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
157e0 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
157f0 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
15800 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
15810 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
15820 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
15830 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
15840 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
15850 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
15860 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
15870 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
15880 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
15890 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
158a0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
158b0 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
158c0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
158d0 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
158e0 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
158f0 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
15900 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
15910 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
15920 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
15930 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
15940 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
15950 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
15960 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
15970 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
15980 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
15990 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
159a0 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
159b0 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
159c0 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
159d0 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
159e0 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
159f0 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
15a00 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
15a10 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
15a20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
15a30 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
15a40 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
15a50 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
15a60 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
15a70 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
15a80 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
15a90 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
15aa0 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
15ab0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
15ac0 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
15ad0 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
15ae0 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
15af0 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
15b00 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
15b10 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
15b20 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
15b30 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
15b40 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
15b50 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
15b60 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
15b70 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
15b80 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
15b90 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
15ba0 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
15bb0 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
15bc0 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
15bd0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
15be0 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
15bf0 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
15c00 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
15c10 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
15c20 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
15c30 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
15c40 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
15c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
15c60 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
15c70 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
15c80 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
15c90 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
15ca0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
15cb0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
15cc0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
15cd0 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
15ce0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
15cf0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
15d00 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15d10 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
15d20 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
15d30 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
15d40 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
15d50 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
15d60 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
15d70 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
15d80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15d90 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
15da0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
15db0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
15dc0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
15dd0 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
15de0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15df0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15e00 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15e10 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15e20 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
15e30 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
15e40 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
15e50 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
15e60 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
15e70 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
15e80 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
15e90 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
15ea0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
15eb0 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
15ec0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
15ed0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
15ee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
15ef0 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
15f00 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
15f10 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
15f20 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15f30 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
15f40 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
15f50 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
15f60 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
15f70 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
15f80 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
15f90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15fa0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
15fb0 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
15fc0 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
15fd0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
15fe0 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
15ff0 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
16000 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
16010 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
16020 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
16030 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
16040 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
16050 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16060 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
16070 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
16080 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
16090 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
160a0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
160b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
160c0 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
160d0 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
160e0 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
160f0 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
16100 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
16110 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
16120 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
16130 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
16140 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
16150 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
16160 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16170 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
16180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
16190 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
161a0 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  ager, p->db);.  
161b0 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
161c0 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
161d0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
161e0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
161f0 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
16200 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16210 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
16220 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
16230 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
16240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
16250 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
16260 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16270 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
16280 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16290 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
162a0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
162b0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
162c0 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
162d0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
162e0 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
162f0 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
16300 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
16310 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
16320 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
16330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16340 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
16350 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74  the "soft" limit
16360 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
16370 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
16380 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20  ache..** Unused 
16390 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70  and unmodified p
163a0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ages will be rec
163b0 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ycled when the n
163c0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
163d0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65  s in the cache e
163e0 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74  xceeds this soft
163f0 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65   limit.  But the
16400 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
16410 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64  cache is allowed
16420 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20   to grow larger 
16430 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20  than this limit 
16440 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  if it contains.*
16450 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72  * dirty pages or
16460 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20   pages still in 
16470 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69  active use..*/.i
16480 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16490 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
164a0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
164b0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
164c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
164d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
164e0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
164f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16500 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16510 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16520 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
16530 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
16540 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
16550 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16570 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
16580 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69  the "spill" limi
16590 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
165a0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
165b0 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65  cache..** If the
165c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
165d0 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69   exceeds this li
165e0 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69  mit during a wri
165f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  te transaction,.
16600 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67  ** the pager mig
16610 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73  ht attempt to "s
16620 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74  pill" pages to t
16630 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79  he journal early
16640 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20   in.** order to 
16650 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a  free up memory..
16660 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
16670 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
16680 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
16690 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20  ze.  If zero is 
166a0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20  passed.** as an 
166b0 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61  argument, no cha
166c0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
166d0 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20   the spill size 
166e0 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75  setting, so.** u
166f0 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30  sing mxPage of 0
16700 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65   is a way to que
16710 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
16720 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e  pill size..*/.in
16730 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
16740 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65  tSpillSize(Btree
16750 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
16760 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16770 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
16780 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
16790 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
167a0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
167b0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
167c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
167d0 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  es = sqlite3Page
167e0 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42  rSetSpillsize(pB
167f0 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
16800 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
16810 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16820 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
16830 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
16840 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
16850 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
16860 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
16870 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16880 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
16890 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
168a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
168b0 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
168c0 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
168d0 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
168e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
168f0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
16900 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16910 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16920 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16930 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16940 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
16950 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
16960 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
16970 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16980 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
169a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
169b0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
169c0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
169d0 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
169e0 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
169f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
16a00 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
16a10 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
16a20 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
16a30 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
16a40 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
16a50 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
16a60 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
16a70 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
16a80 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
16a90 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
16aa0 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
16ab0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
16ac0 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
16ad0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
16ae0 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
16af0 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
16b00 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
16b10 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
16b20 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
16b30 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
16b40 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
16b50 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
16b60 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
16b70 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
16b80 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
16b90 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
16ba0 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
16bb0 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
16bc0 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16be0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
16bf0 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
16c00 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
16c10 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
16c20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
16c30 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
16c40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16c50 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16c60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16c70 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16c80 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16c90 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16ca0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16cb0 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
16cc0 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
16cd0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16ce0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
16cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
16d00 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
16d10 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
16d20 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
16d30 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
16d40 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
16d50 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
16d60 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
16d70 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
16d80 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
16d90 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
16da0 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
16db0 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
16dc0 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
16dd0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
16de0 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
16df0 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
16e00 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
16e10 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
16e20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
16e30 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
16e40 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
16e50 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
16e60 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
16e70 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
16e80 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
16e90 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
16ea0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
16eb0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
16ec0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
16ed0 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
16ee0 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
16ef0 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
16f00 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
16f10 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
16f20 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
16f30 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
16f40 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
16f50 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
16f60 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
16f70 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
16f80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
16f90 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
16fa0 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
16fb0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
16fc0 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
16fd0 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41   then the BTS_PA
16fe0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61  GESIZE_FIXED fla
16ff0 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
17000 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
17010 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
17020 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
17030 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
17040 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17050 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
17060 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
17070 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
17080 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
17090 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
170a0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
170b0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
170c0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
170d0 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
170e0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
170f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17100 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  );.#if SQLITE_HA
17110 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52  S_CODEC.  if( nR
17120 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69  eserve>pBt->opti
17130 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74  malReserve ) pBt
17140 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
17150 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b   = (u8)nReserve;
17160 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
17170 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
17180 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
17190 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
171a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
171b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
171c0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
171d0 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
171e0 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
171f0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
17200 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17210 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17220 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
17230 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
17240 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
17250 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
17260 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
17270 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
17280 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
17290 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
172a0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
172b0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
172c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
172d0 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
172e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
172f0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
17300 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
17310 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
17320 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
17330 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
17340 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
17350 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
17360 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
17370 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
17380 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
17390 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
173a0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
173b0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
173c0 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
173d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
173e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
173f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17400 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
17410 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
17420 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17430 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
17440 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
17450 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
17460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17470 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
17480 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
17490 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
174a0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
174b0 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
174c0 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
174d0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
174e0 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
174f0 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
17500 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
17510 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
17520 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
17530 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
17540 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
17550 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
17560 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
17570 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
17580 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
17590 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
175a0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
175b0 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
175c0 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
175d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
175e0 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
175f0 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
17600 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
17610 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
17620 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
17630 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
17640 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
17650 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
17660 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
17670 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
17680 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
17690 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
176a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
176b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
176c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
176d0 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
176e0 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
176f0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74  sableSize;.  ret
17700 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
17710 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
17720 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
17730 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
17740 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
17750 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
17760 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
17770 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
17780 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
17790 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
177a0 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
177b0 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  ensions..**.** I
177c0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54  f SQLITE_HAS_MUT
177d0 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  EX is defined th
177e0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65  en the number re
177f0 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
17800 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20   greater of the 
17810 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64  current reserved
17820 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d   space and the m
17830 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64  aximum requested
17840 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63  .** reserve spac
17850 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17860 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c  3BtreeGetOptimal
17870 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
17880 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
17890 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
178a0 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
178b0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
178c0 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64  NoMutex(p);.#ifd
178d0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
178e0 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70  DEC.  if( n<p->p
178f0 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17900 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  ve ) n = p->pBt-
17910 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b  >optimalReserve;
17920 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
17930 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17940 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
17950 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
17960 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
17970 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
17980 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
17990 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
179a0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
179b0 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
179c0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
179d0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
179e0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
179f0 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
17a00 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
17a10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17a20 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
17a30 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
17a40 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
17a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17a60 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
17a70 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
17a80 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
17a90 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
17aa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17ab0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
17ac0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  n;.}../*.** Chan
17ad0 67 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ge the values fo
17ae0 72 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  r the BTS_SECURE
17af0 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f  _DELETE and BTS_
17b00 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a  OVERWRITE flags:
17b10 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  .**.**    newFla
17b20 67 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20  g==0       Both 
17b30 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17b40 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  E and BTS_OVERWR
17b50 49 54 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a  ITE are cleared.
17b60 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31  **    newFlag==1
17b70 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52         BTS_SECUR
17b80 45 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64  E_DELETE set and
17b90 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69   BTS_OVERWRITE i
17ba0 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20  s cleared.**    
17bb0 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20  newFlag==2      
17bc0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
17bd0 54 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42  TE cleared and B
17be0 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  TS_OVERWRITE is 
17bf0 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  set.**    newFla
17c00 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68  g==(-1)    No ch
17c10 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73  anges.**.** This
17c20 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73   routine acts as
17c30 20 61 20 71 75 65 72 79 20 69 66 20 6e 65 77 46   a query if newF
17c40 6c 61 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  lag is less than
17c50 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68   zero.**.** With
17c60 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73   BTS_OVERWRITE s
17c70 65 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  et, deleted cont
17c80 65 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74 74  ent is overwritt
17c90 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74  en by zeros, but
17ca0 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61  .** freelist lea
17cb0 66 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  f pages are not 
17cc0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
17cd0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
17ce0 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64  hus in-page.** d
17cf0 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
17d00 73 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66  s cleared, but f
17d10 72 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20  reelist deleted 
17d20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a  content is not..
17d30 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53  **.** With BTS_S
17d40 45 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70  ECURE_DELETE, op
17d50 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20  eration is like 
17d60 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69  BTS_OVERWRITE wi
17d70 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a  th the addition.
17d80 2a 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73 74  ** that freelist
17d90 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
17da0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
17db0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
17dc0 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68  increasing.** th
17dd0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b  e amount of disk
17de0 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   I/O..*/.int sql
17df0 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
17e00 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
17e10 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
17e20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
17e30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17e40 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17e50 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
17e60 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42  BTS_OVERWRITE==B
17e70 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17e80 2a 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *2 );.  assert( 
17e90 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d  BTS_FAST_SECURE=
17ea0 3d 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c  =(BTS_OVERWRITE|
17eb0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17ec0 45 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  E) );.  if( newF
17ed0 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
17ee0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
17ef0 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55  = ~BTS_FAST_SECU
17f00 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e  RE;.    p->pBt->
17f10 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17f20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65  SECURE_DELETE*ne
17f30 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d  wFlag;.  }.  b =
17f40 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
17f50 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45  gs & BTS_FAST_SE
17f60 43 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45  CURE)/BTS_SECURE
17f70 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74  _DELETE;.  sqlit
17f80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17f90 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
17fa0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17fb0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
17fc0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
17fd0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
17fe0 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
17ff0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
18000 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
18010 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
18020 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
18030 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
18040 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
18050 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
18060 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
18070 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
18080 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
18090 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
180a0 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
180b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
180c0 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
180d0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
180e0 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
180f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18100 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
18110 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
18120 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
18130 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
18140 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18150 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
18160 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
18170 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
18180 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
18190 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
181a0 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
181b0 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
181c0 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
181d0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
181e0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
181f0 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
18200 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
18210 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
18220 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
18230 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
18240 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
18250 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18260 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
18270 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18280 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
18290 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
182a0 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
182b0 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
182c0 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
182d0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
182e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
182f0 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
18300 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
18310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18320 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
18330 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
18340 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
18350 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
18360 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18370 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
18380 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
18390 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
183a0 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
183b0 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
183c0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
183d0 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
183e0 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
183f0 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
18400 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18410 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
18420 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
18430 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
18440 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61  s not set the sa
18450 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74  fety-level for t
18460 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
18470 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67  nection.** using
18480 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f   "PRAGMA synchro
18490 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68  nous", and if th
184a0 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69  e safety-level i
184b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
184c0 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
184d0 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
184e0 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65   function as the
184f0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
18500 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e  r,.** set it so.
18510 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .*/.#if SQLITE_D
18520 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
18530 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55  US!=SQLITE_DEFAU
18540 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
18550 55 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  US.static void s
18560 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
18570 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  g(BtShared *pBt,
18580 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c   u8 safety_level
18590 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
185a0 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69  ;.  Db *pDb;.  i
185b0 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21  f( (db=pBt->db)!
185c0 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61  =0 && (pDb=db->a
185d0 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68  Db)!=0 ){.    wh
185e0 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30  ile( pDb->pBt==0
185f0 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42   || pDb->pBt->pB
18600 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b  t!=pBt ){ pDb++;
18610 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e   }.    if( pDb->
18620 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20  bSyncSet==0 .   
18630 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79    && pDb->safety
18640 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c  _level!=safety_l
18650 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44  evel .     && pD
18660 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a  b!=&db->aDb[1] .
18670 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62      ){.      pDb
18680 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ->safety_level =
18690 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20   safety_level;. 
186a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
186b0 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
186c0 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
186d0 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
186e0 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20  el | (db->flags 
186f0 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41  & PAGER_FLAGS_MA
18700 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  SK));.    }.  }.
18710 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
18720 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
18730 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c  lag(pBt,safety_l
18740 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  evel).#endif../*
18750 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
18760 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
18770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18780 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
18790 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
187a0 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
187b0 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
187c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
187d0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
187e0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
187f0 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
18800 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
18810 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
18820 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
18830 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
18840 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
18850 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
18860 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
18870 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
18880 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
18890 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
188a0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
188b0 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
188c0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
188d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
188e0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
188f0 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
18900 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
18910 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50  pPage1;     /* P
18920 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
18930 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
18940 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
18950 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18960 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
18970 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
18980 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20   nPageFile = 0; 
18990 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
189a0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
189b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
189c0 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20  nt nPageHeader; 
189d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
189e0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
189f0 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
18a00 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73   to hdr */..  as
18a10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18a20 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
18a30 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
18a40 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
18a50 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
18a60 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
18a70 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  k(pBt->pPager, p
18a80 42 74 2d 3e 64 62 2d 3e 72 65 61 64 6f 6e 6c 79  Bt->db->readonly
18a90 54 72 61 6e 73 29 3b 0a 20 20 69 66 28 20 72 63  Trans);.  if( rc
18aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
18ab0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
18ac0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
18ad0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
18ae0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18af0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
18b00 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
18b10 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
18b20 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
18b30 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
18b40 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
18b50 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
18b60 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
18b70 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
18b80 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
18b90 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
18ba0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
18bb0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
18bc0 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
18bd0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
18be0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
18bf0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
18c00 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
18c10 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
18c20 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
18c30 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
18c40 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
18c50 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
18c60 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
18c70 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
18c80 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
18c90 61 3b 0a 20 20 20 20 75 38 20 69 31 38 20 3d 20  a;.    u8 i18 = 
18ca0 70 61 67 65 31 5b 31 38 5d 3b 0a 20 20 20 20 75  page1[18];.    u
18cb0 38 20 69 31 39 20 3d 20 70 61 67 65 31 5b 31 39  8 i19 = page1[19
18cc0 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
18cd0 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a  _SERVER_EDITION.
18ce0 20 20 20 20 69 66 28 20 69 31 38 3d 3d 69 31 39      if( i18==i19
18cf0 20 26 26 20 69 31 38 3e 32 20 29 7b 0a 20 20 20   && i18>2 ){.   
18d00 20 20 20 69 31 38 20 2d 3d 20 32 3b 0a 20 20 20     i18 -= 2;.   
18d10 20 20 20 69 31 39 20 2d 3d 20 32 3b 0a 20 20 20     i19 -= 2;.   
18d20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
18d30 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
18d40 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  B;.    /* EVIDEN
18d50 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33  CE-OF: R-43737-3
18d60 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64  9999 Every valid
18d70 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
18d80 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20   file begins.   
18d90 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c   ** with the fol
18da0 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20  lowing 16 bytes 
18db0 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20  (in hex): 53 51 
18dc0 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36  4c 69 74 65 20 6
18dd0 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a  6 6f 72 6d.    *
18de0 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30  * 61 74 20 33 00
18df0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d  . */.    if( mem
18e00 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
18e10 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
18e20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18e30 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
18e40 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
18e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
18e60 20 20 20 69 66 28 20 69 31 38 3e 31 20 29 7b 0a     if( i18>1 ){.
18e70 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
18e80 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
18e90 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
18ea0 69 66 28 20 69 31 39 3e 31 20 29 7b 0a 20 20 20  if( i19>1 ){.   
18eb0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18ec0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18ed0 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 69  .#else.    if( i
18ee0 31 38 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  18>2 ){.      pB
18ef0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
18f00 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
18f10 20 20 7d 0a 20 20 20 20 69 66 28 20 69 31 39 3e    }.    if( i19>
18f20 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
18f30 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18f40 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
18f50 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
18f60 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
18f70 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
18f80 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
18f90 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
18fa0 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
18fb0 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
18fc0 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
18fd0 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
18fe0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
18ff0 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
19000 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
19010 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
19020 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
19030 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
19040 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
19050 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
19060 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
19070 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
19080 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
19090 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
190a0 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
190b0 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
190c0 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
190d0 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
190e0 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
190f0 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
19100 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
19110 20 20 69 66 28 20 69 31 39 3d 3d 32 20 26 26 20    if( i19==2 && 
19120 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
19130 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
19140 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
19150 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
19160 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19170 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
19180 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
19190 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
191a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
191b0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
191c0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
191d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
191e0 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
191f0 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45  g(pBt, SQLITE_DE
19200 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
19210 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20  ONOUS+1);.      
19220 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20    if( isOpen==0 
19230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
19240 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
19250 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
19260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19280 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19290 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65  E_NOTADB;.    }e
192a0 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65  lse{.      setDe
192b0 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
192c0 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
192d0 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  T_SYNCHRONOUS+1)
192e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
192f0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19300 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
19310 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
19320 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
19330 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
19340 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
19350 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
19360 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
19370 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
19380 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
19390 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
193a0 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
193b0 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
193c0 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
193d0 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
193e0 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
193f0 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
19400 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
19410 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
19420 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
19430 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
19440 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
19450 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19460 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
19470 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
19480 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
19490 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
194a0 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
194b0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
194c0 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
194d0 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
194e0 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
194f0 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
19500 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
19510 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19520 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
19530 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
19540 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
19550 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
19560 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19570 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
19580 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
19590 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
195a0 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
195b0 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
195c0 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
195d0 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
195e0 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
195f0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
19600 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
19610 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
19620 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
19630 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19640 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19650 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19660 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
19670 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
19680 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
19690 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
196a0 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
196b0 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
196c0 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
196d0 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
196e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
196f0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
19700 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
19710 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
19720 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
19730 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
19740 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
19750 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
19760 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
19770 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
19780 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
19790 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
197a0 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
197b0 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
197c0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
197d0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
197e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
197f0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
19800 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
19810 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
19820 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
19830 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
19840 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
19850 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
19860 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19870 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
19880 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
19890 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
198a0 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
198b0 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
198c0 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
198d0 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
198e0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
198f0 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
19900 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
19910 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
19920 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
19930 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
19940 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
19950 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
19960 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
19970 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
19980 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
19990 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
199a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
199b0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
199c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
199d0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
199e0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
199f0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
19a00 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
19a10 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
19a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
19a30 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
19a40 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
19a50 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
19a80 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
19a90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19aa0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
19ab0 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
19ac0 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
19ad0 6d 61 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  ma)==0 && nPage>
19ae0 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
19af0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
19b00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
19b10 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19b20 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19b30 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19b40 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
19b50 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
19b60 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
19b70 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
19b80 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
19b90 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
19ba0 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
19bb0 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
19bc0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
19bd0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
19be0 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
19bf0 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
19c00 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
19c10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19c20 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19c30 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
19c40 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19c50 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
19c60 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19c70 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
19c80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19c90 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
19ca0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
19cb0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
19cc0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
19cd0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
19ce0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
19cf0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
19d00 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
19d10 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
19d20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
19d30 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
19d40 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
19d50 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
19d60 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
19d70 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
19d80 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
19d90 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
19da0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
19db0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
19dc0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
19dd0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
19de0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
19df0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
19e00 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
19e10 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
19e20 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
19e30 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
19e40 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
19e50 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
19e60 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
19e70 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
19e80 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
19e90 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
19ea0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19eb0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
19ec0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
19ed0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
19ee0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
19ef0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
19f00 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
19f10 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
19f20 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
19f30 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
19f40 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
19f50 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
19f60 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
19f70 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
19f80 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
19f90 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
19fa0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
19fb0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19fc0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19fd0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
19fe0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
19ff0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
1a000 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
1a010 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
1a020 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1a030 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
1a040 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
1a050 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
1a060 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
1a070 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
1a080 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
1a090 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
1a0a0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
1a0b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1a0c0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
1a0d0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
1a0e0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
1a0f0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
1a100 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1a110 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1a120 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
1a130 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
1a140 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1a150 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
1a160 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
1a170 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1a180 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
1a190 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1a1a0 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
1a1b0 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
1a1c0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1a1d0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1a1e0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1a1f0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1a200 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1a210 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
1a220 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
1a230 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
1a240 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
1a250 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
1a260 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
1a270 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1a280 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
1a290 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
1a2a0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
1a2b0 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1a2c0 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1a2d0 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
1a2e0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
1a2f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
1a300 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
1a310 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1a320 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1a330 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1a340 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1a350 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1a360 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1a370 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1a380 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1a390 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1a3a0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1a3b0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1a3c0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1a3d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a3e0 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1a3f0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1a400 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1a410 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1a420 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1a430 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1a440 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1a450 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a460 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1a470 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1a480 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1a490 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1a4a0 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1a4b0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1a4c0 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1a4d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1a4e0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1a4f0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1a500 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1a510 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a520 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1a530 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1a540 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1a550 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1a560 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1a570 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1a580 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a590 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1a5a0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1a5b0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1a5c0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1a5d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a5e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a5f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a600 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1a610 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1a620 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1a630 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1a640 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1a650 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a660 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1a670 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1a680 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a690 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a6a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a6b0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1a6c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a6d0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a6e0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1a6f0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1a700 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1a710 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1a720 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1a730 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1a740 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1a750 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1a760 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1a770 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1a780 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1a790 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1a7a0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1a7b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1a7c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1a7d0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1a7e0 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1a7f0 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1a800 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1a810 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a820 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a830 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a840 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1a850 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1a860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a870 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1a880 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1a890 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1a8a0 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1a8b0 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1a8c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a8d0 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1a8e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a8f0 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1a900 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1a910 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a920 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1a930 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1a940 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1a950 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1a960 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1a970 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1a980 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1a990 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1a9a0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1a9b0 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1a9c0 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1a9d0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a9e0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1a9f0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1aa00 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1aa10 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1aa20 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1aa30 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1aa40 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1aa50 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1aa60 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1aa70 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1aa80 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1aa90 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1aaa0 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1aab0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1aac0 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1aad0 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1aae0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1aaf0 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1ab00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ab10 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1ab20 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1ab30 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1ab40 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1ab50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1ab60 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1ab70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1ab80 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1ab90 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1aba0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1abb0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1abc0 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1abd0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1abe0 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1abf0 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1ac00 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1ac10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ac20 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1ac30 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1ac40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ac50 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1ac60 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1ac70 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1ac80 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1ac90 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1aca0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1acb0 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1acc0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1acd0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1ace0 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1acf0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1ad00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1ad10 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1ad20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ad30 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1ad40 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1ad50 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1ad60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1ad70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1ad80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1ad90 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1ada0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1adb0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1adc0 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1add0 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1ade0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1adf0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1ae00 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1ae10 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1ae20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1ae30 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1ae40 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1ae50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1ae60 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1ae70 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1ae80 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1ae90 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1aea0 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1aeb0 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1aec0 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1aed0 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1aee0 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1aef0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1af00 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1af10 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1af20 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1af30 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1af40 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1af50 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1af60 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1af70 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1af80 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1af90 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1afa0 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1afb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1afc0 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1afd0 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1afe0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1aff0 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1b000 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b010 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1b020 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1b030 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1b040 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1b050 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1b060 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1b070 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1b080 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1b090 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1b0a0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1b0b0 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1b0c0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1b0d0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1b0e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1b0f0 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1b100 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1b110 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1b120 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1b130 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1b140 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1b150 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1b160 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1b170 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1b180 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1b190 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1b1a0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1b1b0 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1b1c0 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1b1d0 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1b1e0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1b1f0 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1b200 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1b210 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1b220 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1b230 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1b240 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1b250 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1b260 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1b270 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1b280 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1b290 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1b2a0 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1b2b0 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1b2c0 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1b2d0 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1b2e0 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1b2f0 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1b300 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1b310 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1b320 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1b330 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1b340 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1b350 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1b360 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1b370 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1b380 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1b390 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1b3a0 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1b3b0 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1b3c0 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1b3d0 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1b3e0 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1b3f0 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1b400 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1b410 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1b420 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1b430 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1b440 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1b450 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b460 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1b470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b480 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1b490 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1b4a0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1b4b0 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1b4c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1b4d0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1b4e0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1b4f0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1b500 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1b510 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1b520 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1b530 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1b540 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1b550 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1b560 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1b570 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1b580 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1b590 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1b5a0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b5b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1b5c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b5d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1b5e0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1b5f0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1b600 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1b610 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1b620 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1b630 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1b640 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1b650 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b660 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1b670 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1b680 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1b690 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1b6a0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b6b0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1b6c0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1b6d0 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1b6e0 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1b6f0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1b700 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1b710 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1b720 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1b730 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1b740 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1b750 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1b760 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1b770 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b780 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1b790 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1b7a0 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1b7b0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1b7c0 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1b7d0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b7e0 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1b7f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b800 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1b810 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1b820 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1b830 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1b840 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1b850 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1b860 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1b870 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1b880 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1b890 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1b8a0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1b8b0 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1b8c0 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1b8d0 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1b8e0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1b8f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1b900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b910 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1b920 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1b930 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1b940 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1b950 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b960 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1b970 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1b980 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1b990 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1b9a0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1b9b0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1b9c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1b9d0 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1b9e0 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1b9f0 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1ba00 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1ba10 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1ba20 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1ba30 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1ba40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1ba50 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1ba60 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1ba70 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1ba80 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1ba90 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1baa0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1bab0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1bac0 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1bad0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1bae0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1baf0 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1bb00 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1bb10 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1bb20 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1bb30 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1bb40 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1bb50 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1bb60 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1bb70 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1bb80 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1bb90 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1bba0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1bbb0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1bbc0 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1bbd0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1bbe0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1bbf0 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1bc00 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1bc10 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1bc20 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1bc30 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1bc40 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1bc50 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1bc60 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1bc70 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1bc80 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1bc90 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1bca0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1bcb0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1bcc0 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1bcd0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1bce0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1bcf0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1bd00 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1bd10 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1bd20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1bd30 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1bd40 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1bd50 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1bd60 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1bd70 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1bd80 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1bd90 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1bda0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1bdb0 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1bdc0 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1bdd0 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1bde0 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1bdf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1be00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1be10 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1be20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1be30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1be40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1be50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1be60 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1be70 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1be80 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1be90 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1bea0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1beb0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1bec0 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1bed0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1bee0 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1bef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bf00 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1bf10 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1bf20 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1bf30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1bf40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bf50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1bf60 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1bf70 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1bf80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1bf90 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1bfa0 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1bfb0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1bfc0 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1bfd0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1bfe0 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1bff0 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1c000 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1c010 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1c020 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1c030 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1c040 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1c050 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1c060 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1c070 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1c080 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1c090 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c0a0 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1c0b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1c0c0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1c0d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1c0e0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1c0f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c100 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1c110 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1c120 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1c130 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1c140 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1c150 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1c160 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1c170 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1c180 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1c190 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1c1a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1c1b0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1c1c0 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1c1d0 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1c1e0 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1c1f0 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1c200 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1c210 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1c220 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1c230 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1c240 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1c250 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1c260 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1c270 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1c280 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1c290 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1c2a0 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1c2b0 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1c2c0 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1c2d0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1c2e0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1c2f0 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1c300 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1c310 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1c320 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1c330 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1c340 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1c350 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1c360 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1c370 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1c380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1c3a0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1c3b0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1c3c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1c3d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c3e0 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1c3f0 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1c400 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1c410 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1c420 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1c430 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1c440 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1c450 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1c460 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1c470 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1c480 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1c490 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1c4a0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1c4b0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1c4c0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1c4d0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1c4e0 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1c4f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c500 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1c510 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1c520 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1c530 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1c540 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1c550 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c560 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1c570 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1c580 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1c590 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1c5a0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1c5b0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1c5c0 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1c5d0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1c5e0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1c5f0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1c600 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c610 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1c620 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1c630 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1c640 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1c650 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1c660 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1c670 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1c680 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1c6b0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1c6c0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c6f0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1c700 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1c710 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c730 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1c740 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c750 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1c760 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1c770 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1c780 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c790 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1c7a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1c7b0 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  c = pPage->isIni
1c7c0 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  t ? SQLITE_OK : 
1c7d0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1c7e0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1c7f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1c800 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d  rn rc;.  nCell =
1c810 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1c820 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1c830 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
1c840 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1c850 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
1c860 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
1c870 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1c880 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
1c890 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1c8a0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
1c8b0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1c8c0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
1c8d0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1c8e0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1c8f0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1c900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1c910 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1c920 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
1c930 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1c940 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1c950 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1c960 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
1c970 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1c980 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1c990 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1c9a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1c9b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
1c9c0 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
1c9d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
1c9e0 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
1c9f0 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
1ca00 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1ca10 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
1ca20 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
1ca30 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
1ca40 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
1ca50 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
1ca60 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
1ca70 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
1ca80 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1ca90 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1caa0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
1cab0 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
1cac0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1cad0 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
1cae0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1caf0 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
1cb00 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1cb10 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1cb20 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
1cb50 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
1cb60 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
1cb70 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1cb80 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
1cb90 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
1cba0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1cbb0 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
1cbc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1cbd0 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
1cbe0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
1cbf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1cc00 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1cc10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1cc20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
1cc30 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
1cc40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cc50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1cc60 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1cc70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1cc80 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1cc90 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
1cca0 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
1ccb0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1ccc0 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
1ccd0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
1cce0 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
1ccf0 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
1cd00 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1cd10 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
1cd20 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1cd30 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
1cd40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1cd50 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
1cd60 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
1cd70 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1cd80 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1cd90 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1cda0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1cdb0 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  t nCell;.    int
1cdc0 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   rc;..    rc = p
1cdd0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53  Page->isInit ? S
1cde0 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65  QLITE_OK : btree
1cdf0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1ce00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1ce10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65  turn rc;.    nCe
1ce20 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1ce30 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
1ce40 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1ce50 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
1ce60 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1ce70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1ce80 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1ce90 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
1cea0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1ceb0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
1cec0 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
1ced0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1cee0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
1cef0 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
1cf00 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
1cf10 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69       if( pCell+i
1cf20 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67  nfo.nSize > pPag
1cf30 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1cf40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1cf50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1cf60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1cf70 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
1cf80 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1cf90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1cfa0 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
1cfb0 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1cfc0 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ze-4) ){.       
1cfd0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1cfe0 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1cff0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1d000 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d020 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d030 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1d040 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
1d050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1d060 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
1d070 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1d080 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1d090 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1d0a0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
1d0b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
1d0c0 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
1d0d0 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
1d0e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1d0f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1d100 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
1d110 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
1d120 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1d130 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
1d140 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
1d150 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1d160 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d170 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1d180 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   iTo);.    }.  }
1d190 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d1a0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1d1b0 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1d1c0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1d1d0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1d1e0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1d1f0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1d200 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1d210 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1d220 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1d230 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1d240 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1d250 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1d260 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1d270 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1d280 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1d290 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1d2a0 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1d2b0 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1d2c0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1d2d0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1d2e0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1d2f0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1d300 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1d310 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1d320 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1d330 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1d340 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1d350 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1d360 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1d370 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1d380 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1d390 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1d3a0 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1d3b0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1d3c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1d3d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1d3e0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1d3f0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1d400 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1d410 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1d420 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1d430 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1d440 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1d450 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1d460 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1d470 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1d480 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1d490 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1d4a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1d4b0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1d4c0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1d4d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1d4e0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1d4f0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1d500 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1d510 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1d520 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1d530 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1d540 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1d550 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1d560 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1d570 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1d580 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1d590 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1d5a0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1d5b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d5c0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d5d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1d5e0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1d5f0 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
1d600 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1d610 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1d620 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1d630 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1d640 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1d650 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1d660 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1d670 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1d680 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1d690 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1d6a0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1d6b0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1d6c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1d6d0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1d6e0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1d6f0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1d700 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1d710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1d730 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1d740 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1d750 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1d760 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1d770 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1d780 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1d790 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1d7a0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1d7b0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1d7c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1d7d0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1d7e0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1d7f0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1d800 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1d810 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1d820 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1d830 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1d840 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1d850 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1d860 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1d870 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1d880 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1d890 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1d8a0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1d8b0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1d8c0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1d8d0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1d8e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1d8f0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1d900 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1d910 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1d920 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1d930 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1d940 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d960 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1d980 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1d990 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1d9a0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1d9b0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1d9c0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1d9d0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1d9e0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1d9f0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1da00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1da10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1da20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1da30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1da40 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1da50 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1da60 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1da70 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1da80 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1da90 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1daa0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1dab0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1dac0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1dad0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1dae0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1daf0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1db00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1db10 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1db20 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1db30 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1db40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1db50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1db60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1db70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1db80 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1db90 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1dba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1dbb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1dbc0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1dbd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1dbe0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1dbf0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1dc00 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1dc10 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1dc20 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1dc30 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1dc40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dc50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1dc60 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1dc70 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1dc80 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1dc90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1dca0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1dcb0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1dcc0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1dcd0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1dce0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1dcf0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1dd00 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1dd10 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1dd20 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1dd30 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1dd40 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1dd50 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1dd60 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1dd70 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1dd80 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1dd90 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1dda0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1ddb0 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1ddc0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1ddd0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1dde0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1ddf0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1de00 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1de10 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1de20 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1de30 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1de40 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1de50 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1de60 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1de70 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1de80 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1de90 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1dea0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1deb0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1dec0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1ded0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1dee0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1def0 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1df00 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1df10 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1df20 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1df30 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1df40 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1df50 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1df60 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1df70 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1df80 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1df90 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1dfa0 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1dfb0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1dfc0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1dfd0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1dfe0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1dff0 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1e000 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1e010 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1e020 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1e030 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1e040 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1e050 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1e060 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1e070 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1e080 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1e090 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1e0a0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1e0b0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1e0c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e0d0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1e0e0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1e0f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1e100 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e110 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1e120 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1e130 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1e140 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1e150 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e160 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1e170 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1e180 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1e190 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1e1a0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1e1b0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1e1c0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e1d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e1e0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1e1f0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1e200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e210 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1e220 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1e230 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1e240 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1e250 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e270 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e280 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1e290 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e2a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e2b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e2c0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1e2d0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1e2e0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1e2f0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1e300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1e310 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1e320 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1e330 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1e340 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1e350 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1e360 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1e370 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1e380 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1e390 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1e3a0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1e3b0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1e3c0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1e3d0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1e3e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1e3f0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1e400 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1e410 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1e420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e430 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1e440 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1e450 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1e460 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1e470 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1e480 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1e490 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1e4a0 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1e4b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e4c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e4d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1e4f0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1e500 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1e510 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1e520 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1e530 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1e540 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e560 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1e570 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1e580 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1e590 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1e5a0 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1e5b0 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1e5c0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1e5d0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1e5e0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1e5f0 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1e600 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1e610 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1e620 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1e630 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1e640 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1e650 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1e660 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1e670 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e690 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e6a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1e6b0 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1e6c0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1e6d0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1e6e0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1e6f0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1e700 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1e710 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1e720 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1e730 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1e740 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1e750 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1e760 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1e770 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1e780 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1e790 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1e7a0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1e7b0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1e7c0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1e7d0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1e7e0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1e7f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1e800 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1e810 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1e820 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1e830 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1e840 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1e850 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1e860 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1e870 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1e880 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1e890 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1e8a0 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1e8b0 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1e8c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1e8e0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1e8f0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1e900 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1e910 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1e920 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1e930 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1e940 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1e950 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1e960 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1e970 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1e980 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1e990 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1e9a0 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1e9b0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1e9c0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1e9d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1e9e0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1e9f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ea00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ea10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1ea20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1ea30 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1ea40 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1ea50 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1ea60 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1ea70 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ea80 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1ea90 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1eaa0 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1eab0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1eac0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1ead0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1eae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1eaf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1eb00 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1eb10 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1eb20 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1eb30 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1eb40 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1eb50 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1eb60 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1eb70 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1eb80 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1eb90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1eba0 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1ebb0 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1ebc0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1ebd0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1ebe0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1ebf0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1ec00 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1ec10 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1ec40 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1ec50 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1ec60 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ec80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1ec90 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1eca0 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1ecb0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1ecc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1ecd0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1ece0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1ecf0 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1ed00 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1ed10 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1ed20 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1ed30 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1ed40 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1ed50 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1ed60 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1ed70 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ed80 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1ed90 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1eda0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1edb0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1edc0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1edd0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1ede0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1edf0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1ee00 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1ee10 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1ee20 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1ee30 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1ee40 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1ee50 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1ee60 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1ee70 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1ee80 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1ee90 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1eea0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1eeb0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1eec0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1eed0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1eee0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1eef0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1ef00 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1ef10 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1ef20 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1ef30 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1ef40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1ef50 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1ef60 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1ef70 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1ef80 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1ef90 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1efa0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1efb0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1efc0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1efd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1efe0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1eff0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1f000 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1f010 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1f020 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1f030 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1f040 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1f050 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1f060 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1f070 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1f080 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1f090 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1f0a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f0b0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1f0c0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1f0d0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1f0e0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1f0f0 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1f100 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f110 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f120 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1f130 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1f140 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1f150 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1f160 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f180 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1f190 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1f1a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1f1b0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1f1c0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1f1d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1f1e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f1f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f200 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f210 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1f220 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f230 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f240 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f250 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1f260 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1f270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f280 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1f290 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1f2a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1f2b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f2c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f2d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1f2e0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1f2f0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1f300 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1f310 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1f320 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1f330 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1f340 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1f350 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1f360 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1f370 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1f380 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1f390 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1f3a0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1f3b0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1f3c0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1f3d0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1f3e0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1f3f0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1f400 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1f410 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1f420 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1f430 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1f440 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1f450 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1f460 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f470 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1f480 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1f490 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1f4a0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1f4b0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1f4c0 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
1f4d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1f4e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1f4f0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1f500 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1f510 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1f520 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1f530 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1f540 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1f550 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1f560 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f570 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1f580 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1f590 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1f5a0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1f5b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1f5c0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1f5d0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
1f5e0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
1f5f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1f600 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
1f610 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
1f620 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
1f630 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1f640 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
1f650 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
1f660 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1f670 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
1f680 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1f690 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
1f6a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f6b0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1f6c0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
1f6d0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
1f6e0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
1f6f0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1f700 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1f710 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1f720 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1f730 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1f740 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1f750 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1f760 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1f770 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1f780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1f790 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f7a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1f7b0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1f7c0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1f7d0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1f7e0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1f7f0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1f800 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1f810 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1f820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f830 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1f840 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1f850 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1f860 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1f870 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1f880 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1f890 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1f8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1f8b0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1f8c0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1f8d0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1f8e0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1f8f0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1f900 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1f910 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
1f920 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1f930 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f940 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1f950 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f960 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1f970 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1f980 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
1f990 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1f9a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1f9b0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1f9c0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f9d0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
1f9e0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
1f9f0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1fa00 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1fa10 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
1fa20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fa30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1fa40 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1fa50 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1fa60 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1fa70 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
1fa80 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1fa90 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
1faa0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
1fab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fac0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
1fad0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
1fae0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
1faf0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
1fb00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1fb10 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1fb20 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
1fb30 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1fb40 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
1fb50 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
1fb60 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
1fb70 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
1fb80 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1fb90 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
1fba0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
1fbb0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1fbc0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1fbd0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1fbe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1fbf0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1fc00 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1fc10 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1fc20 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1fc30 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1fc40 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1fc50 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1fc60 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1fc70 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1fc80 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1fc90 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1fca0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1fcb0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1fcc0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fcd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1fce0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1fcf0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1fd00 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1fd10 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1fd20 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1fd30 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1fd40 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1fd50 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1fd60 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1fd70 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1fd80 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1fd90 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1fda0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1fdb0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1fdc0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1fdd0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1fde0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1fdf0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1fe00 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1fe10 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1fe20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1fe30 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1fe40 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1fe50 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1fe60 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1fe70 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1fe80 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1fe90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fea0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1feb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fec0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1fed0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1fee0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1fef0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1ff00 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1ff10 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1ff20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1ff30 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1ff40 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1ff50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1ff60 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1ff70 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1ff80 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1ff90 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1ffa0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1ffb0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1ffc0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1ffd0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1ffe0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1fff0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
20000 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
20010 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
20020 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
20030 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
20040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
20050 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20060 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
20070 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
20080 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
20090 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
200a0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
200b0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
200c0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
200d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
200e0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
200f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
20100 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20110 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20120 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
20130 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
20140 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
20150 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
20160 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20170 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20180 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20190 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
201a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
201b0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
201c0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
201d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
201e0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
201f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
20200 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
20210 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
20220 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20230 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
20240 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
20250 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
20260 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20270 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20280 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20290 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
202a0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
202b0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
202c0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
202d0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
202e0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
202f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
20300 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
20310 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
20320 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
20330 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20340 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
20350 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
20360 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
20370 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
20380 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20390 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
203a0 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
203b0 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
203c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
203d0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
203e0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
203f0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
20400 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
20410 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
20420 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
20430 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
20440 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
20450 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
20460 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
20470 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
20480 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
20490 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
204a0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
204b0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
204c0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
204d0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
204e0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
204f0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
20500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
20510 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
20520 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
20530 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
20540 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
20550 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20560 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
20570 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
20580 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20590 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
205a0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
205b0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
205c0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
205d0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
205e0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
205f0 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
20600 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
20610 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
20620 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
20630 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
20640 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
20650 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
20660 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
20670 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
20680 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
20690 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
206a0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
206b0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
206c0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
206d0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
206e0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
206f0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
20700 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
20710 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
20720 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
20730 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
20740 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
20750 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
20760 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
20770 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
20780 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
20790 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
207a0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
207b0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
207c0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
207d0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
207e0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
207f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20800 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
20810 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
20820 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
20830 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
20840 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20850 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
20860 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
20870 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
20880 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
20890 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
208a0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
208b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
208c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
208d0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
208e0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
208f0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
20900 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
20910 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
20920 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
20930 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
20940 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
20950 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
20960 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
20970 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
20980 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
20990 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
209a0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
209b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
209c0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
209d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
209e0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
209f0 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
20a00 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
20a10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
20a20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
20a30 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
20a40 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
20a50 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
20a60 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
20a70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
20a80 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
20a90 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
20aa0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
20ab0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
20ac0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
20ad0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
20ae0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
20af0 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
20b00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
20b10 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
20b20 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
20b30 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
20b40 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
20b50 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
20b60 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
20b70 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
20b80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20b90 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
20ba0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
20bb0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
20bc0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
20bd0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
20be0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
20bf0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
20c00 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
20c10 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
20c20 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
20c30 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20c40 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
20c50 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
20c60 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
20c70 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
20c80 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
20c90 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
20ca0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
20cb0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
20cc0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
20cd0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
20ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20cf0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
20d00 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
20d10 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
20d20 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
20d30 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
20d40 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
20d50 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
20d60 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
20d70 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
20d80 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
20d90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20da0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
20db0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
20dc0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
20dd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
20de0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
20df0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
20e00 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
20e10 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
20e20 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
20e30 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
20e40 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
20e50 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
20e60 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
20e70 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
20e80 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
20e90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20ea0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
20eb0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20ec0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
20ed0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20ee0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
20ef0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
20f00 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20f10 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
20f20 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
20f30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
20f40 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
20f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
20f60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
20f70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20f80 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
20f90 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
20fa0 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
20fb0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
20fc0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
20fd0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
20fe0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
20ff0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
21000 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
21010 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
21020 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
21030 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21040 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21050 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21060 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
21070 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
21080 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21090 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
210a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
210b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
210c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
210d0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
210e0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
210f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21100 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
21110 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21120 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
21130 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
21140 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21150 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21160 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21170 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
21180 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
21190 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
211a0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
211b0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
211c0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
211d0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
211e0 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
211f0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
21200 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
21210 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
21220 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
21230 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
21240 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
21250 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
21260 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
21270 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
21280 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
21290 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
212a0 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
212b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
212c0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
212d0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
212e0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
212f0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
21300 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
21310 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
21320 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
21330 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
21340 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
21350 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
21360 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
21370 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
21380 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
21390 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
213a0 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
213b0 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
213c0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
213d0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
213e0 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
213f0 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
21400 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
21410 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
21420 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
21430 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
21440 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
21450 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21460 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
21470 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
21480 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
21490 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
214a0 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
214b0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
214c0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
214d0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
214e0 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
214f0 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
21500 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
21510 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
21520 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
21530 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
21540 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
21550 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
21560 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
21570 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21580 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
21590 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
215a0 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
215b0 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
215c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
215d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
215e0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
215f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
21600 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
21610 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
21620 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
21630 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
21640 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
21650 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
21660 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
21670 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
21680 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
21690 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
216a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
216b0 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
216c0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
216d0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
216e0 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
216f0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
21700 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21710 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
21720 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
21730 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
21740 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
21750 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
21760 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
21770 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
21780 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21790 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
217a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
217b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
217c0 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
217d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
217e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
217f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21810 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
21820 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
21830 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
21840 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
21850 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21860 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
21890 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
218a0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
218b0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
218c0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
218d0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
218e0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
218f0 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c  }.      btreeRel
21900 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
21910 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  es(p);.    }.   
21920 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21930 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
21940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21950 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
21960 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
21970 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
21980 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
21990 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
219a0 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
219b0 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
219c0 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
219d0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
219e0 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
219f0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
21a00 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
21a10 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
21a20 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
21a30 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
21a40 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
21a50 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
21a60 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
21a70 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
21a80 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
21a90 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
21aa0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21ab0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
21ac0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
21ad0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
21ae0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
21af0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
21b00 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
21b10 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
21b20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
21b30 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
21b40 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
21b50 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21b60 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21b70 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
21b80 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
21b90 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
21ba0 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
21bb0 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
21bc0 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
21bd0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
21be0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
21bf0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
21c00 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
21c10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
21c20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
21c30 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
21c40 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
21c50 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
21c60 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
21c70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21c80 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
21c90 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
21ca0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
21cb0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
21cc0 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
21cd0 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
21ce0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
21cf0 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
21d00 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
21d10 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
21d20 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
21d30 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
21d40 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
21d50 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
21d60 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21d70 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
21d80 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
21d90 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
21da0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21db0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
21dc0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
21dd0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
21de0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
21df0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21e00 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
21e10 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
21e20 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
21e30 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
21e40 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
21e50 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
21e60 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
21e70 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
21e80 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
21e90 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
21ea0 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
21eb0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
21ec0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
21ed0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
21ee0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
21ef0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
21f00 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
21f10 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
21f20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21f30 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
21f40 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
21f50 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
21f60 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
21f70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21f80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21f90 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
21fa0 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
21fb0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
21fc0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21fd0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
21fe0 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
21ff0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
22000 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
22010 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
22020 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
22030 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
22040 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
22050 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
22060 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
22070 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22080 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
22090 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
220a0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
220b0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
220c0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
220d0 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
220e0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
220f0 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
22100 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
22110 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
22120 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
22130 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
22140 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
22150 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
22160 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
22170 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
22180 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
22190 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
221a0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
221b0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
221c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
221d0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
221e0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
221f0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
22200 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
22210 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
22220 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
22230 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
22240 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
22250 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
22260 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
22270 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
22280 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
22290 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
222a0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
222b0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
222c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
222d0 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
222e0 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
222f0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
22300 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
22310 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
22320 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
22330 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
22340 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
22350 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
22360 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
22370 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
22380 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
22390 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
223a0 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
223b0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
223c0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
223d0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
223e0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
223f0 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
22400 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
22410 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
22420 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
22430 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
22440 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
22450 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
22460 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
22470 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
22480 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
22490 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
224a0 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
224b0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
224c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
224d0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
224e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
224f0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
22500 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
22510 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
22520 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
22530 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
22540 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
22550 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
22560 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
22570 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
22580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
22590 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
225a0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
225b0 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
225c0 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
225d0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
225e0 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
225f0 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
22600 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
22610 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
22620 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
22630 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
22640 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
22650 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
22660 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
22670 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
22680 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
22690 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
226a0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
226b0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
226c0 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
226d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
226e0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
226f0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
22700 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
22710 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
22720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22730 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
22740 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
22750 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
22760 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
22770 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
22780 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
22790 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
227a0 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
227b0 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
227c0 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
227d0 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
227e0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
227f0 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
22800 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
22810 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
22820 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
22830 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
22840 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
22850 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
22860 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
22870 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
22880 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
22890 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
228a0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
228b0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
228c0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
228d0 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
228e0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
228f0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
22900 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
22910 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
22920 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
22930 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
22940 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
22950 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
22960 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22970 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
22980 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
22990 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
229a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
229b0 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
229c0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
229d0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
229e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
229f0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
22a00 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
22a10 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
22a20 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
22a30 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
22a40 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
22a50 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
22a60 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
22a70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
22a80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22a90 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66  Enter(p);.    if
22aa0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
22ab0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
22ac0 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
22ad0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
22ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22b00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22b10 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
22b20 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
22b30 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
22b40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
22b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22b60 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
22b70 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
22b80 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
22b90 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
22ba0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
22bb0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
22bc0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
22bd0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
22be0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
22bf0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
22c00 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
22c10 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
22c20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
22c30 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
22c40 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
22c50 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
22c60 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
22c70 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
22c80 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
22c90 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
22ca0 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
22cb0 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
22cc0 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
22cd0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
22ce0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
22cf0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
22d00 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
22d10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
22d20 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
22d30 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
22d40 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
22d50 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
22d60 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
22d70 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
22d80 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
22d90 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
22da0 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
22db0 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
22dc0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
22dd0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
22de0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22df0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
22e00 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
22e10 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
22e20 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
22e30 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
22e40 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
22e50 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22e60 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
22e70 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  SR bit of wrFlag
22e80 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
22e90 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
22ea0 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66  nly.** be used f
22eb0 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20  or reading.  If 
22ec0 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
22ed0 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
22ee0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
22ef0 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
22f00 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72  eading or for wr
22f10 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
22f20 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
22f30 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73  iting.** are als
22f40 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72  o met.  These ar
22f50 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
22f60 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
22f70 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f  t in order.** fo
22f80 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20  r writing to be 
22f90 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
22fa0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
22fb0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
22fc0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20  ned with wrFlag 
22fd0 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45  containing BTREE
22fe0 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20  _WRCSR.**.** 2: 
22ff0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
23000 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
23010 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
23020 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
23030 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
23040 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
23050 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
23060 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
23070 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
23080 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
23090 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
230a0 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
230b0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
230c0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
230d0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
230e0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
230f0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
23100 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
23110 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
23120 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
23130 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
23140 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
23150 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
23160 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
23170 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
23180 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
23190 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
231a0 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44  * The BTREE_FORD
231b0 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46  ELETE bit of wrF
231c0 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c  lag may optional
231d0 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52  ly be set if BTR
231e0 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73  EE_WRCSR.** is s
231f0 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54  et.  If FORDELET
23200 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69  E is set, that i
23210 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
23220 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
23230 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73  hat.** this curs
23240 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  or will only be 
23250 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20  used to seek to 
23260 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69  and delete entri
23270 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  es of an index.*
23280 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c  * as part of a l
23290 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61  arger DELETE sta
232a0 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52  tement.  The FOR
232b0 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e  DELETE hint is n
232c0 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ot used by.** th
232d0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
232e0 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70  n.  But in a hyp
232f0 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e  othetical altern
23300 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
23310 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63  gine .** in whic
23320 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  h index entries 
23330 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
23340 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63  y deleted when c
23350 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
23360 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64  le.** rows are d
23370 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44  eleted, the FORD
23380 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20  ELETE flag is a 
23390 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45  hint that all SE
233a0 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a  EK and DELETE.**
233b0 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
233c0 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62  his cursor can b
233d0 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c  e no-ops and all
233e0 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73   READ operations
233f0 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20   can .** return 
23400 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79  a null row (2-by
23410 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e  tes: 0x01 0x00).
23420 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
23430 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
23440 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
23450 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
23460 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
23470 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
23480 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
23490 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
234a0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
234b0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
234c0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
234d0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
234e0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
234f0 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
23500 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
23510 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
23520 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
23530 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
23540 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
23550 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
23560 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
23570 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23590 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
235a0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
235b0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235d0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
235e0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
235f0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
23620 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
23630 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
23640 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
23650 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
23660 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
23670 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
23680 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
23690 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236b0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
236c0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
236d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
236e0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
236f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
23700 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
23710 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
23720 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23740 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
23750 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
23760 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
23770 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
23780 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
23790 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
237a0 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
237b0 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
237c0 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
237d0 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
237e0 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
237f0 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
23800 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
23810 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
23820 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
23830 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
23840 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
23850 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
23860 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
23870 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
23880 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
23890 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
238a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
238b0 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
238c0 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
238d0 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
238e0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
238f0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
23900 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
23910 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
23920 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
23930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
23940 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
23950 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
23960 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
23970 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
23980 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
23990 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
239a0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
239b0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
239c0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
239d0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
239e0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
239f0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
23a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
23a10 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
23a20 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
23a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
23a40 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
23a50 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
23a60 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
23a70 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
23a80 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
23a90 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
23aa0 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
23ab0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
23ac0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
23ad0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  T;.  }.  if( iTa
23ae0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
23af0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
23b00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23b10 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
23b20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
23b30 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
23b40 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
23b50 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
23b60 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
23b70 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
23b80 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
23b90 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
23ba0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
23bb0 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
23bc0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
23bd0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
23be0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
23bf0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
23c00 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
23c10 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
23c20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
23c30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
23c40 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
23c50 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
23c60 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
23c70 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
23c80 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
23c90 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
23ca0 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
23cb0 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
23cc0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
23cd0 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
23ce0 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
23cf0 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
23d00 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
23d10 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
23d20 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
23d30 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
23d40 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
23d50 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
23d60 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
23d70 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
23d80 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
23d90 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
23da0 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
23db0 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
23dc0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
23dd0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
23de0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
23df0 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
23e00 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
23e10 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
23e20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
23e30 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23e40 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e70 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
23e80 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23ec0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
23ed0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f00 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
23f10 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
23f20 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
23f30 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
23f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23f50 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
23f60 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
23f70 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
23fa0 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
23fb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
23fc0 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
23fd0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
23fe0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
24000 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
24010 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
24020 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
24030 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
24040 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
24050 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
24060 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
24070 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24080 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
24090 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
240a0 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
240b0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
240c0 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
240d0 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
240e0 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
240f0 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
24100 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
24110 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
24120 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
24130 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
24140 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
24150 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
24160 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
24170 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
24180 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
24190 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
241a0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
241b0 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
241c0 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
241d0 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
241e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
241f0 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
24200 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
24210 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
24220 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
24230 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
24240 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
24250 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
24260 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
24270 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
24280 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
24290 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
242a0 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
242b0 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
242c0 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
242d0 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
242e0 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
242f0 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
24300 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
24310 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
24320 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
24330 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
24340 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
24350 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
24360 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
24370 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
24380 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
24390 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
243a0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
243b0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
243c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
243d0 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
243e0 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
243f0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
24400 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
24410 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
24420 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
24430 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
24440 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
24450 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
24460 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
24470 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
24480 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
24490 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
244a0 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
244b0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
244c0 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65  (pCur);.    asse
244d0 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
244e0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
244f0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
24500 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
24510 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
24520 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
24530 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
24540 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
24550 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
24560 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
24570 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
24580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
24590 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
245a0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
245b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
245c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
245d0 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
245e0 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
245f0 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
24600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
24610 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
24620 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
24630 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
24640 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
24650 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
24660 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
24670 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71  sed(pBt);.    sq
24680 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
24690 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >aOverflow);.   
246a0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
246b0 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
246c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
246d0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
246e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
246f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
24700 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
24710 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
24720 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
24730 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
24740 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
24750 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
24760 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
24770 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
24780 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
24790 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
247a0 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
247b0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
247c0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
247d0 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
247e0 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
247f0 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
24800 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
24810 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
24820 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
24830 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
24840 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
24850 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24860 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
24870 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61  nfo;.    int iPa
24880 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
24890 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
248a0 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
248b0 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50  fo));.    btreeP
248c0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
248d0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
248e0 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a  ur->ix, &info);.
248f0 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
24900 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
24910 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
24920 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
24930 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
24940 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
24950 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
24960 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
24970 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
24980 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
24990 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
249a0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
249b0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
249c0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
249d0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75  ->iPage;.    pCu
249e0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
249f0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
24a00 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
24a10 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
24a20 50 61 67 65 5d 2c 70 43 75 72 2d 3e 69 78 2c 26  Page],pCur->ix,&
24a30 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
24a40 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
24a50 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
24a60 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
24a70 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
24a80 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
24a90 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
24aa0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
24ab0 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
24ac0 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
24ad0 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
24ae0 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
24af0 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
24b00 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
24b10 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
24b20 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
24b30 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
24b40 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
24b50 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
24b60 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
24b70 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
24b80 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
24b90 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
24ba0 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
24bb0 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
24bc0 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
24bd0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24be0 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
24bf0 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
24c00 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
24c10 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
24c20 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
24c30 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
24c40 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
24c50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24c60 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
24c70 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
24c80 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
24c90 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
24ca0 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
24cb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24cc0 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
24cd0 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
24ce0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
24cf0 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
24d00 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
24d10 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
24d20 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
24d30 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
24d40 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
24d50 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
24d60 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
24d70 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
24d80 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
24d90 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24da0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
24db0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
24dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24dd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
24de0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
24df0 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
24e00 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
24e10 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
24e20 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
24e30 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  .nKey;.}../*.** 
24e40 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
24e50 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
24e60 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
24e70 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
24e80 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
24e90 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
24ea0 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
24eb0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
24ec0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
24ed0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
24ee0 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
24ef0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
24f00 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
24f10 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
24f20 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
24f30 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
24f40 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
24f50 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
24f60 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
24f70 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
24f80 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
24f90 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
24fa0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
24fb0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
24fc0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
24fd0 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
24fe0 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
24ff0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
25000 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25010 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25020 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25030 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25040 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
25050 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
25060 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
25070 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
25080 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
25090 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
250a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
250b0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
250c0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
250d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
250e0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
250f0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
25100 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
25110 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
25120 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
25130 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
25140 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
25150 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
25160 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
25170 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
25180 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
25190 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
251a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
251b0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
251c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
251d0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
251e0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
251f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25200 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
25210 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
25220 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
25230 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
25240 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
25250 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
25260 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
25270 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
25280 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
25290 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
252a0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
252b0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
252c0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
252d0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
252e0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
252f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
25300 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
25310 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
25320 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
25330 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
25340 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
25350 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
25360 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
25370 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
25380 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
25390 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
253a0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
253b0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
253c0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
253d0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
253e0 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
253f0 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
25400 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
25410 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
25420 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
25430 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
25440 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
25450 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
25460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25470 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25480 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
254b0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
254c0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
254d0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
254e0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
254f0 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
25500 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
25510 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
25520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
25530 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
25540 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
25550 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
25560 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
25570 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
25580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
255a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
255b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
255c0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
255d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
255e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
255f0 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
25600 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
25610 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
25620 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
25630 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
25640 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
25650 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
25660 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
25670 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
25680 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
25690 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
256a0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
256b0 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
256c0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
256d0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
256e0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
256f0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
25700 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
25710 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
25720 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
25730 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
25740 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
25750 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
25760 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
25770 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
25780 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
25790 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
257a0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
257b0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
257c0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
257d0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
257e0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
257f0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
25800 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
25810 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
25820 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
25830 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
25840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25850 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
25860 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
25870 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
25880 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
25890 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
258a0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
258b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
258c0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
258d0 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
258e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
258f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25900 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
25910 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
25920 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
25930 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
25940 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
25950 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
25960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
25970 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
25980 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25990 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
259a0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
259b0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
259c0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
259d0 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
259e0 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
259f0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
25a00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
25a10 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
25a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
25a30 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
25a40 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
25a50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
25a60 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
25a70 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
25a80 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
25a90 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
25aa0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
25ab0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
25ac0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
25ad0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
25ae0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
25af0 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
25b00 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
25b10 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
25b20 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
25b30 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
25b40 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
25b50 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
25b60 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
25b70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
25b80 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
25b90 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
25ba0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
25bb0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
25bc0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
25bd0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
25be0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
25bf0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
25c00 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
25c10 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
25c20 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
25c30 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
25c40 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
25c50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
25c60 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
25c70 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
25c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
25c90 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
25ca0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
25cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
25cd0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
25ce0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
25cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
25d00 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
25d10 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
25d20 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
25d30 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
25d40 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
25d50 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
25d60 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
25d70 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
25d80 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
25d90 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
25da0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
25db0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
25dc0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
25dd0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
25de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25e00 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
25e10 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
25e20 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
25e30 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
25e40 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
25e50 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
25e60 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
25e70 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
25e80 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
25e90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25ea0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25eb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25ec0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
25ed0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
25ee0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
25ef0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
25f00 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
25f10 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25f20 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
25f30 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
25f40 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
25f50 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
25f60 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
25f70 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
25f80 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
25f90 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
25fa0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
25fb0 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
25fc0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
25fd0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
25fe0 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
25ff0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
26000 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
26010 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
26020 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
26030 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
26040 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
26050 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
26060 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
26070 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
26080 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
26090 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
260a0 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
260b0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
260c0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
260d0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
260e0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
260f0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
26100 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ages.** this fun
26110 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
26120 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
26130 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
26140 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  .** the overflow
26150 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26160 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
26170 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
26180 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
26190 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
261a0 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
261b0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
261c0 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
261d0 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
261e0 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
261f0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
26200 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
26210 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62  cated, it must b
26220 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
26230 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
26240 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
26250 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
26260 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
26270 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
26280 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
26290 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
262a0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
262b0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
262c0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
262d0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
262e0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
262f0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
26300 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
26310 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
26320 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
26330 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
26340 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
26350 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
26360 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
26370 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
26380 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
26390 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
263a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
263b0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
263c0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
263d0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
263e0 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
263f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
26400 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
26410 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
26420 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
26430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26440 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
26450 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
26460 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
26470 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
26480 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
26490 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
264b0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
264c0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
264d0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
264e0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
264f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26500 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
26510 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
26520 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
26530 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26540 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
26550 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
26560 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
26570 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
26580 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
26590 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
265a0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
265b0 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
265c0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
265d0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
265e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
265f0 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
26600 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61  pBuf;     /* Sta
26610 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f  rt of original o
26620 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e  ut buffer */.#en
26630 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
26640 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
26650 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d  ( eOp==0 || eOp=
26660 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
26670 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26680 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26690 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
266a0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
266b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
266c0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
266d0 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
266e0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
266f0 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
26700 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61  fo.pPayload;.  a
26710 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
26720 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
26730 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61  nPayload );..  a
26740 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20  ssert( aPayload 
26750 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  > pPage->aData )
26760 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61  ;.  if( (uptr)(a
26770 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d  Payload - pPage-
26780 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e  >aData) > (pBt->
26790 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75  usableSize - pCu
267a0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  r->info.nLocal) 
267b0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
267c0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
267d0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
267e0 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
267f0 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20   error.  The.   
26800 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   ** conditional 
26810 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a  above is really:
26820 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79  .    **    &aPay
26830 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
26840 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
26850 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
26860 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20  bleSize].    ** 
26870 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e  but is recast in
26880 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66  to its current f
26890 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74  orm to avoid int
268a0 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72  eger overflow pr
268b0 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20  oblems.    */.  
268c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
268d0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
268e0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a  ge->pgno);.  }..
268f0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
26900 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
26910 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
26920 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
26930 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
26940 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
26950 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
26960 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
26970 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
26980 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
26990 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
269a0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
269b0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
269c0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
269d0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
269e0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
269f0 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
26a00 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
26a10 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
26a20 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
26a30 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
26a40 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
26a50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
26a60 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
26a70 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
26a80 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
26a90 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
26aa0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
26ab0 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
26ac0 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
26ad0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
26ae0 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
26af0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26b00 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
26b10 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
26b20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
26b30 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
26b40 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
26b50 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
26b60 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
26b70 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
26b80 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
26b90 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
26ba0 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
26bb0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
26bc0 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
26bd0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
26be0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
26bf0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
26c00 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
26c10 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
26c20 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
26c30 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
26c40 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
26c50 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
26c60 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
26c70 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
26c80 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
26c90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26ca0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
26cb0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
26cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
26cd0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
26ce0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
26cf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
26d00 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
26d10 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
26d20 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
26d30 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
26d40 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
26d50 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
26d60 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
26d70 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
26d80 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
26d90 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
26da0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
26db0 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
26dc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26dd0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
26de0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26df0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f          pCur->nO
26e00 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c  vflAlloc = nOvfl
26e10 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  *2;.          pC
26e20 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
26e30 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aNew;.        }.
26e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
26e50 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
26e60 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
26e70 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
26e80 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
26e90 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
26ea0 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ovfl;.    }else{
26eb0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
26ec0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
26ed0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
26ee0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
26ef0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e   the.      ** en
26f00 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
26f10 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
26f20 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
26f30 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a  d, skip.      **
26f40 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
26f50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26f60 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
26f70 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
26f80 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  ize] ){.        
26f90 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
26fa0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
26fb0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
26fc0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26fd0 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  x];.        offs
26fe0 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
26ff0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  lSize);.      }.
27000 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
27010 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
27020 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20   && amt>0 );.   
27030 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65   while( nextPage
27040 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
27050 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
27060 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
27070 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
27080 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
27090 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
270a0 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20  w[iIdx]==0.     
270b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72           || pCur
270c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
270d0 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20  ]==nextPage.    
270e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52            || COR
270f0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20  RUPT_DB );.     
27100 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27110 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
27120 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  e;..      if( of
27130 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
27140 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
27150 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
27160 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
27170 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
27180 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
27190 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
271a0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
271b0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
271c0 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
271d0 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
271e0 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
271f0 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
27200 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
27210 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
27220 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
27230 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
27240 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
27250 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
27260 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
27270 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27280 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27290 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
272a0 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
272b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
272c0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  r->pBtree->db==p
272d0 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20  Bt->db );.      
272e0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
272f0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
27300 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
27310 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
27320 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
27330 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27340 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
27350 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
27360 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
27370 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
27380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
27390 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
273a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
273b0 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
273c0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
273d0 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
273e0 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
273f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
27400 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
27410 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
27420 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
27430 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
27440 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
27450 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
27460 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
27470 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
27480 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c 65  fd;      /* File
27490 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64   from which to d
274a0 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f  o direct overflo
274b0 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  w read */.#endif
274c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
274d0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
274e0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
274f0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
27500 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
27510 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
27520 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
27530 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
27540 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
27550 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
27560 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
27570 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
27580 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
27590 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
275a0 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
275b0 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
275c0 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
275d0 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
275e0 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
275f0 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
27600 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 69   **   3) there i
27610 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
27620 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
27630 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
27640 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
27650 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
27660 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
27670 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  ) the page is no
27680 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c  t in the WAL fil
27690 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  e.        **   6
276a0 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
276b0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
276c0 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
276d0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
276e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
276f0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
27700 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
27710 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
27720 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
27730 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
27740 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
27750 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
27760 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
27770 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
27780 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
27790 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
277a0 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
277b0 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
277c0 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
277d0 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
277e0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27810 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
27820 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27850 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
27860 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
27870 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
27880 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20  ==TRANS_READ    
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278a0 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
278b0 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c      && (fd = sql
278c0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
278d0 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65  t->pPager))->pMe
278e0 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34 29  thods     /* (4)
278f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
27900 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55  0==sqlite3PagerU
27910 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  seWal(pBt->pPage
27920 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20 20  r, nextPage)    
27930 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20     /* (5) */.   
27940 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d        && &pBuf[-
27950 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20  4]>=pBufStart   
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
27980 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  6) */.        ){
27990 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
279a0 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
279b0 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
279c0 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
279d0 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69      assert( aWri
279e0 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b  te>=pBufStart );
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a00 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20           /* due 
27a10 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  to (6) */.      
27a20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
27a30 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
27a40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27a50 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
27a60 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
27a70 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
27a80 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
27a90 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
27aa0 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
27ab0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
27ac0 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
27ad0 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
27ae0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
27af0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
27b00 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
27b10 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
27b20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
27b30 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
27b40 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
27b50 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
27b60 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45    (eOp==0 ? PAGE
27b70 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
27b80 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
27b90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
27ba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
27bc0 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
27bd0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
27be0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
27bf0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
27c00 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
27c10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
27c20 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
27c30 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
27c40 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
27c50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
27c70 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
27c80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
27c90 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
27ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27cb0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
27cc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d  ;.        if( am
27cd0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  t==0 ) return rc
27ce0 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
27cf0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
27d00 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
27d10 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b  k;.      iIdx++;
27d20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
27d30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27d40 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
27d50 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69  /* Overflow chai
27d60 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65  n ends premature
27d70 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
27d80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
27d90 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
27da0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27db0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
27dc0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61  d part of the pa
27dd0 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f  yload for the ro
27de0 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20  w at which that 
27df0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63  cursor pCur is c
27e00 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
27e10 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74  ting.  "amt" byt
27e20 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
27e30 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
27e40 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
27e50 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
27e60 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70  offset"..**.** p
27e70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74  Cur can be point
27e80 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20  ing to either a 
27e90 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65  table or an inde
27ea0 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20  x b-tree..** If 
27eb0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
27ec0 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ble btree, then 
27ed0 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74  the content sect
27ee0 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66  ion is read.  If
27ef0 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e  .** pCur is poin
27f00 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
27f10 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65   b-tree then the
27f20 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20   key section is 
27f30 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
27f40 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27f50 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65  oad(), the calle
27f60 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
27f70 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
27f80 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
27f90 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  d row in the tab
27fa0 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33  le.  For sqlite3
27fb0 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
27fc0 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75  ked(), the.** cu
27fd0 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e  rsor might be in
27fe0 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e  valid or might n
27ff0 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eed to be restor
28000 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
28010 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  read..**.** Retu
28020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
28030 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
28040 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
28050 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
28060 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
28070 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
28080 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
28090 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
280a0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
280b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
280c0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74  3BtreePayload(Bt
280d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
280e0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
280f0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
28100 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
28110 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
28120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28130 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28140 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
28150 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
28160 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
28170 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28180 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
28190 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70  Cur->ix<pCur->ap
281a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
281b0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
281c0 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
281d0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
281e0 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
281f0 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
28200 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61  }../*.** This va
28210 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33  riant of sqlite3
28220 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77  BtreePayload() w
28230 6f 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65  orks even if the
28240 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a   cursor has not.
28250 2a 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52  ** in the CURSOR
28260 5f 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49  _VALID state.  I
28270 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
28280 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  y the sqlite3_bl
28290 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74  ob_read().** int
282a0 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64  erface..*/.#ifnd
282b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
282c0 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53  NCRBLOB.static S
282d0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
282e0 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
282f0 43 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72  Checked(.  BtCur
28300 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32  sor *pCur,.  u32
28310 20 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61   offset,.  u32 a
28320 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  mt,.  void *pBuf
28330 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
28340 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
28350 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
28360 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
28370 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
28380 7d 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  }.  assert( curs
28390 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
283a0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  Cur) );.  rc = b
283b0 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
283c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
283d0 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72  .  return rc ? r
283e0 63 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c : accessPayloa
283f0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
28400 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d  amt, pBuf, 0);.}
28410 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28420 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  ePayloadChecked(
28430 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
28440 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
28450 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
28460 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  {.  if( pCur->eS
28470 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28480 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
28490 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
284a0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
284b0 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
284c0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
284d0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
284e0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
284f0 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
28500 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75  yloadChecked(pCu
28510 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
28520 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  pBuf);.  }.}.#en
28530 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
28540 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
28550 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
28560 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
28570 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
28580 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
28590 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
285a0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
285b0 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
285c0 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
285d0 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
285e0 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74   key if index bt
285f0 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
28600 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74  Key==0) and is t
28610 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  he data for.** t
28620 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61  able btrees (pPa
28630 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20  ge->intKey==1). 
28640 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
28650 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
28660 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20  .** key/data is 
28670 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41  written into *pA
28680 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
28690 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
286a0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c  .** returned wil
286b0 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  l not be a valid
286c0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
286d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
286e0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
286f0 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
28700 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
28710 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
28720 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
28730 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
28740 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
28750 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
28760 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
28770 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
28780 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
28790 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
287a0 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
287b0 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
287c0 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
287d0 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
287e0 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
287f0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
28800 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
28810 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
28820 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
28830 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
28840 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
28850 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
28860 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
28870 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
28880 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
28890 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
288a0 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
288b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
288c0 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
288d0 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
288e0 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
288f0 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
28900 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
28910 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
28920 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f  void *fetchPaylo
28930 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
28940 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
28950 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
28960 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
28970 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41  rom */.  u32 *pA
28980 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt            /*
28990 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
289a0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
289b0 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ytes here */.){.
289c0 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73    u32 amt;.  ass
289d0 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
289e0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
289f0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
28a00 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
28a10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
28a20 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28a30 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
28a40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
28a50 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
28a60 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
28a70 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
28a80 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
28a90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28aa0 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70  Cur->ix<pCur->ap
28ab0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28ac0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
28ad0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
28ae0 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
28af0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
28b00 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
28b10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28b20 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f  ge]->aData || CO
28b30 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
28b40 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
28b50 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e  .pPayload<pCur->
28b60 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28b70 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  ge]->aDataEnd ||
28b80 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
28b90 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d  mt = (int)(pCur-
28ba0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28bb0 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d  age]->aDataEnd -
28bc0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
28bd0 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75  load);.  if( pCu
28be0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61  r->info.nLocal<a
28bf0 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d  mt ) amt = pCur-
28c00 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
28c10 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72  *pAmt = amt;.  r
28c20 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
28c30 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28c40 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
28c50 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
28c60 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
28c70 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
28c80 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
28c90 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
28ca0 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
28cb0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
28cc0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
28cd0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
28ce0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
28cf0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
28d00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
28d10 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
28d20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
28d30 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
28d40 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
28d50 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
28d60 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
28d70 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
28d80 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
28d90 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
28da0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
28db0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
28dc0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
28dd0 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
28de0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
28df0 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
28e00 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
28e10 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
28e20 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
28e30 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
28e40 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
28e50 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
28e60 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
28e70 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
28e80 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
28e90 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
28ea0 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74  ePayloadFetch(Bt
28eb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
28ec0 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
28ed0 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
28ee0 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a  pCur, pAmt);.}..
28ef0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
28f00 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
28f10 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
28f20 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
28f30 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
28f40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
28f50 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
28f60 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
28f70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
28f80 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
28f90 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
28fa0 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
28fb0 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
28fc0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
28fd0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
28fe0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
28ff0 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
29000 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
29010 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
29020 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
29030 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
29040 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
29050 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
29060 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
29070 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
29080 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
29090 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
290a0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
290b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
290c0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
290d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
290e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
290f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
29100 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
29110 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
29120 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
29130 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
29140 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
29150 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
29160 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
29170 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29180 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29190 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66  .  }.  pCur->inf
291a0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
291b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
291c0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
291d0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
291e0 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  );.  pCur->aiIdx
291f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 5d 20  [pCur->iPage++] 
29200 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43  = pCur->ix;.  pC
29210 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 72 65  ur->ix = 0;.  re
29220 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50  turn getAndInitP
29230 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
29240 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
29250 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72        pCur, pCur
29280 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
29290 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
292a0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
292b0 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
292c0 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
292d0 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
292e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
292f0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
29300 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
29310 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
29320 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
29330 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
29340 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
29350 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
29360 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
29370 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
29380 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
29390 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
293a0 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
293b0 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
293c0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
293d0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
293e0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
293f0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
29400 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
29410 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50  d){.  if( CORRUP
29420 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20  T_DB ) return;  
29430 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
29440 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d  s tested below m
29450 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65  ight not be true
29460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
29480 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
29490 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  abase */.  asser
294a0 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
294b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
294c0 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
294d0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
294e0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
294f0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
29500 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
29510 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
29520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
29530 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
29540 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
29550 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
29560 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
29570 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
29580 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
29590 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
295a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
295b0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
295c0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
295d0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
295e0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
295f0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
29600 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
29610 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
29620 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
29630 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
29640 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
29650 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
29660 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
29670 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
29680 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
29690 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
296a0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
296b0 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
296c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
296d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
296e0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
296f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29700 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29710 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29720 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
29730 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
29740 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
29750 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
29760 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
29770 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
29780 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29790 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
297a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
297b0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
297c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
297d0 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
297e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75  .  testcase( pCu
297f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29800 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e  Page-1] > pCur->
29810 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29820 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  ge-1]->nCell );.
29830 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
29840 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
29850 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
29860 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
29870 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
29880 70 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d  pCur->ix = pCur-
29890 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
298a0 67 65 2d 31 5d 3b 0a 20 20 72 65 6c 65 61 73 65  ge-1];.  release
298b0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
298c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
298d0 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  Page--]);.}../*.
298e0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
298f0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
29900 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
29910 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
29920 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
29930 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
29940 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
29950 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
29960 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
29970 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
29980 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
29990 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
299a0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
299b0 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
299c0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
299d0 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
299e0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
299f0 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
29a00 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
29a10 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
29a20 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
29a30 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
29a40 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
29a50 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
29a60 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
29a70 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
29a80 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
29a90 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
29aa0 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
29ab0 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
29ac0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
29ad0 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
29ae0 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
29af0 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
29b00 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
29b10 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
29b20 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
29b30 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
29b40 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
29b50 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
29b60 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
29b70 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
29b80 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
29b90 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
29ba0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
29bb0 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
29bc0 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
29bd0 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
29be0 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
29bf0 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
29c00 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
29c10 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
29c20 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
29c30 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
29c40 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
29c50 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
29c60 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
29c70 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
29c80 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
29c90 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
29ca0 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
29cb0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
29cc0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
29cd0 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
29ce0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
29cf0 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
29d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
29d10 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
29d20 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
29d30 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
29d40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29d50 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
29d60 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
29d70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
29d80 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
29d90 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
29da0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
29db0 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
29dc0 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
29dd0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
29de0 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
29df0 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
29e00 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
29e10 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
29e20 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e < CURSOR_REQUI
29e30 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e  RESEEK || pCur->
29e40 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66  iPage<0 );..  if
29e50 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
29e60 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
29e70 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
29e80 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73   do{.        ass
29e90 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
29ea0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d  e[pCur->iPage]!=
29eb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 );.        rel
29ec0 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
29ed0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29ee0 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
29ef0 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
29f00 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->iPage);.      
29f10 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
29f20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
29f30 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
29f40 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
29f50 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29f60 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
29f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
29f90 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29fa0 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 69 66  ==(-1) );.    if
29fb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
29fc0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
29fd0 45 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  EK ){.      if( 
29fe0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29ff0 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2a000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a010 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
2a020 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2a030 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
2a040 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  skipNext;.      
2a050 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
2a060 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
2a070 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2a080 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
2a090 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65  Page(pCur->pBtre
2a0a0 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  e->pBt, pCur->pg
2a0b0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
2a0c0 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20  pPage[0],.      
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61    0, pCur->curPa
2a0f0 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  gerFlags);.    i
2a100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a110 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
2a120 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2a130 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
2a140 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2a150 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
2a160 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
2a170 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72  curIntKey = pCur
2a180 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
2a190 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  Key;.  }.  pRoot
2a1a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2a1b0 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
2a1c0 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
2a1d0 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
2a1e0 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
2a1f0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
2a200 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
2a210 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
2a220 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
2a230 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
2a240 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
2a250 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
2a260 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
2a270 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
2a280 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
2a290 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
2a2a0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2a2b0 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
2a2c0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
2a2d0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
2a2e0 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
2a2f0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2a300 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
2a310 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
2a320 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
2a330 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
2a340 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
2a350 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2a360 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2a370 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
2a380 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
2a390 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
2a3a0 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
2a3b0 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
2a3c0 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
2a3d0 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
2a3e0 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
2a3f0 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
2a400 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
2a410 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
2a420 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2a430 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
2a440 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
2a450 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
2a460 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
2a470 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
2a480 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
2a490 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
2a4a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2a4b0 5f 50 47 4e 4f 28 70 43 75 72 2d 3e 61 70 50 61  _PGNO(pCur->apPa
2a4c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a4d0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 6b 69  >pgno);.  }..ski
2a4e0 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72  p_init:  .  pCur
2a4f0 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  ->ix = 0;.  pCur
2a500 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2a510 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2a520 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
2a530 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  ast|BTCF_ValidNK
2a540 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2a550 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70  l);..  pRoot = p
2a560 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
2a570 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
2a580 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ll>0 ){.    pCur
2a590 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2a5a0 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
2a5b0 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61   if( !pRoot->lea
2a5c0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
2a5d0 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
2a5e0 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
2a5f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2a600 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2a610 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
2a620 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
2a630 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
2a640 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
2a650 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2a660 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
2a670 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2a680 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
2a690 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
2a6a0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2a6b0 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72  INVALID;.  }.  r
2a6c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a6d0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2a6e0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
2a6f0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
2a700 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
2a710 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
2a720 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2a730 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
2a740 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
2a750 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
2a760 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
2a770 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
2a780 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
2a790 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
2a7a0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
2a7b0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2a7c0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2a7d0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2a7e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2a7f0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2a800 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2a810 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2a820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a830 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2a840 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2a850 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2a860 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
2a870 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a880 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
2a890 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2a8a0 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e  Cur->ix<pPage->n
2a8b0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
2a8c0 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
2a8d0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2a8e0 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->ix));.    rc =
2a8f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2a900 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
2a910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a920 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2a930 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2a940 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
2a950 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2a960 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
2a970 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2a980 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
2a990 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
2a9a0 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
2a9b0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
2a9c0 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
2a9d0 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
2a9e0 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
2a9f0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
2aa00 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2aa10 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
2aa20 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
2aa30 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
2aa40 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2aa50 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
2aa60 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
2aa70 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2aa80 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
2aa90 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
2aaa0 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
2aab0 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
2aac0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2aad0 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
2aae0 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
2aaf0 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
2ab00 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
2ab10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2ab20 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
2ab30 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2ab40 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2ab50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2ab60 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ab70 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2ab80 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
2ab90 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2aba0 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
2abb0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
2abc0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2abd0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2abe0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2abf0 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67   pCur->ix = pPag
2ac00 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
2ac10 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2ac20 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
2ac30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ac40 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
2ac50 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ix = pPage->nCel
2ac60 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l-1;.  assert( p
2ac70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2ac80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2ac90 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2aca0 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
2acb0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2acc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2acd0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2ace0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
2acf0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2ad00 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
2ad10 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
2ad20 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
2ad30 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
2ad40 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
2ad50 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
2ad60 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
2ad70 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
2ad80 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2ad90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
2ada0 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
2adb0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2adc0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
2add0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2ade0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2adf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ae00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2ae10 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2ae20 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
2ae30 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2ae40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2ae50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2ae60 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ae70 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2ae80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ae90 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2aea0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2aeb0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2aec0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2aed0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2aee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2aef0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2af00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2af10 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
2af20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2af30 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
2af40 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2af50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2af60 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2af70 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2af80 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2af90 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2afa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
2afb0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
2afc0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
2afd0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
2afe0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
2aff0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
2b000 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
2b010 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2b020 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2b030 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
2b040 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2b050 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2b060 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
2b070 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2b080 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2b090 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b0a0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2b0b0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2b0c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2b0d0 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
2b0e0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
2b0f0 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
2b100 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
2b110 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
2b120 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
2b130 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2b140 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2b150 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
2b160 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
2b170 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
2b180 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
2b190 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
2b1a0 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
2b1b0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
2b1c0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2b1d0 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
2b1e0 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
2b1f0 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
2b200 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
2b210 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b220 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
2b230 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
2b240 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
2b250 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b260 78 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  x==pCur->apPage[
2b270 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2b280 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
2b290 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2b2a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2b2b0 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
2b2c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b2d0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
2b2e0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2b2f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2b300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2b310 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2b320 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2b330 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2b340 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2b350 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2b360 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2b370 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2b380 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2b390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2b3a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2b3b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2b3c0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
2b3d0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2b3e0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2b3f0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28  pCur);.      if(
2b400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b410 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2b420 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2b430 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
2b440 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
2b450 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2b460 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20  ~BTCF_AtLast;.  
2b470 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a      }.   .    }.
2b480 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b490 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2b4a0 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
2b4b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
2b4c0 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
2b4d0 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
2b4e0 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
2b4f0 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
2b500 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
2b510 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
2b520 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
2b530 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
2b540 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
2b550 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
2b560 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
2b570 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
2b580 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
2b590 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
2b5a0 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
2b5b0 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
2b5c0 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
2b5d0 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
2b5e0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2b5f0 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
2b600 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
2b610 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
2b620 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
2b630 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
2b640 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
2b650 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
2b660 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
2b670 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
2b680 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
2b690 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
2b6a0 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
2b6b0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
2b6c0 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
2b6d0 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
2b6e0 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
2b6f0 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
2b700 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
2b710 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
2b720 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
2b730 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
2b740 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
2b750 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
2b760 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2b770 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2b780 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2b790 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
2b7a0 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
2b7b0 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
2b7c0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2b7d0 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
2b7e0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
2b7f0 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
2b800 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
2b810 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
2b820 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
2b830 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
2b840 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2b850 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
2b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b870 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
2b880 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
2b890 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
2b8a0 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
2b8b0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2b8c0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2b8d0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2b8e0 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
2b8f0 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
2b900 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46  pIdxKey..**.** F
2b910 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
2b920 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65 71   the pIdxKey->eq
2b930 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73 65  Seen field is se
2b940 74 20 74 6f 20 31 20 69 66 20 74 68 65 72 65 0a  t to 1 if there.
2b950 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74  ** exists an ent
2b960 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
2b970 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61 74  that exactly mat
2b980 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20 0a  ches pIdxKey.  .
2b990 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2b9a0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
2b9b0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
2b9c0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
2b9d0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
2b9e0 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
2b9f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
2ba00 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
2ba10 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
2ba20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
2ba30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ba40 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
2ba50 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
2ba60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
2ba70 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
2ba80 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
2ba90 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
2baa0 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
2bab0 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
2bac0 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
2bad0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
2bae0 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20    RecordCompare 
2baf0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  xRecordCompare;.
2bb00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2bb10 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2bb20 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2bb30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2bb40 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2bb50 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2bb60 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
2bb70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
2bb80 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2bb90 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
2bba0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2bbb0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2bbc0 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b 65  VALID || (pIdxKe
2bbd0 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75  y==0)==(pCur->cu
2bbe0 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a  rIntKey!=0) );..
2bbf0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
2bc00 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
2bc10 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
2bc20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
2bc30 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
2bc40 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
2bc50 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
2bc60 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
2bc70 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
2bc80 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74  .   && pCur->eSt
2bc90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2bca0 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  D && (pCur->curF
2bcb0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2bcc0 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20  dNKey)!=0.  ){. 
2bcd0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2bce0 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
2bcf0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2bd00 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
2bd10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2bd20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
2bd30 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
2bd40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 43  ){.      if( (pC
2bd50 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2bd60 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
2bd70 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2bd80 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72 65  = -1;.        re
2bd90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bda0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
2bdb0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
2bdc0 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72  d key is one mor
2bdd0 65 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69  e than the previ
2bde0 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20  ous key, then.  
2bdf0 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67 65      ** try to ge
2be00 74 20 74 68 65 72 65 20 75 73 69 6e 67 20 73 71  t there using sq
2be10 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2be20 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 66   rather than a f
2be30 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e  ull.      ** bin
2be40 61 72 79 20 73 65 61 72 63 68 2e 20 20 54 68 69  ary search.  Thi
2be50 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
2be60 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20  tion only.  The 
2be70 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a 20  correct answer. 
2be80 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
2be90 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75   obtained withou
2bea0 74 20 74 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c  t this case, onl
2beb0 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20  y a little more 
2bec0 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20  slowely */.     
2bed0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2bee0 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 26  nKey+1==intKey &
2bef0 26 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  & !pCur->skipNex
2bf00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  t ){.        *pR
2bf10 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2bf20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2bf30 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a  eNext(pCur, 0);.
2bf40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2bf50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bf60 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e         getCellIn
2bf70 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
2bf80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2bf90 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2bfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2bfb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bfc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bfd0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
2bfe0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2bff0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2c000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c020 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2c030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c040 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
2c050 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
2c060 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
2c070 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69   = sqlite3VdbeFi
2c080 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65  ndCompare(pIdxKe
2c090 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d  y);.    pIdxKey-
2c0a0 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
2c0b0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65    assert( pIdxKe
2c0c0 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31  y->default_rc==1
2c0d0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2c0e0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2c0f0 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  c==0 .         |
2c100 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
2c110 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b  lt_rc==-1.    );
2c120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52  .  }else{.    xR
2c130 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30  ecordCompare = 0
2c140 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72  ; /* All keys ar
2c150 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20  e integers */.  
2c160 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2c170 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2c180 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
2c190 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2c1a0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2c1b0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2c1c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2c1d0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
2c1e0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2c1f0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2c200 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2c210 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
2c220 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2c230 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
2c240 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  D || pCur->apPag
2c250 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2c260 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28  nCell>0 );.  if(
2c270 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2c280 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
2c290 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
2c2a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2c2b0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2c2c0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2c2d0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2c2e0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
2c2f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c300 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
2c310 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
2c320 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49  tKey==pCur->curI
2c330 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  ntKey );.  asser
2c340 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  t( pCur->curIntK
2c350 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
2c360 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
2c370 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
2c380 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63  x, c;.    Pgno c
2c390 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
2c3a0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2c3b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2c3c0 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70  Page];.    u8 *p
2c3d0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
2c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c3f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
2c400 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
2c410 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
2c420 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
2c430 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2c440 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
2c450 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
2c460 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
2c470 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
2c480 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
2c490 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
2c4a0 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
2c4b0 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
2c4c0 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
2c4d0 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
2c4e0 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
2c4f0 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
2c500 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
2c510 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
2c520 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
2c530 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
2c540 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
2c550 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
2c560 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
2c570 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
2c580 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
2c590 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
2c5a0 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
2c5b0 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
2c5c0 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
2c5d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2c5e0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
2c5f0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2c600 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
2c610 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
2c620 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
2c630 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2c640 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
2c650 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
2c660 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
2c670 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
2c680 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
2c690 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
2c6a0 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
2c6b0 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20  */.    pCur->ix 
2c6c0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2c6d0 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
2c6e0 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
2c6f0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2c700 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
2c710 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2c720 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2c730 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20  age, idx);.     
2c740 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2c750 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
2c760 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38        while( 0x8
2c770 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20  0 <= *(pCell++) 
2c780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2c790 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d  f( pCell>=pPage-
2c7a0 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20  >aDataEnd ){.   
2c7b0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2c7c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2c7d0 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
2c7e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
2c7f0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2c800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c810 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
2c820 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
2c830 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
2c840 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
2c850 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
2c860 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
2c870 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2c880 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  { c = -1; break;
2c890 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2c8a0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e   if( nCellKey>in
2c8b0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2c8c0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2c8d0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
2c8e0 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20  >upr ){ c = +1; 
2c8f0 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
2c900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c910 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
2c920 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ey==intKey );.  
2c930 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2c940 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2c950 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2c960 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2c970 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2c980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2c990 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2c9a0 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2c9b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c9c0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2c9d0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2c9e0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2c9f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2ca00 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
2ca10 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2ca20 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2ca30 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
2ca40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2ca50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ca60 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2ca70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ca80 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2ca90 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2caa0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2cab0 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2cac0 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2cad0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2cae0 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2caf0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
2cb00 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  l;  /* Size of t
2cb10 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e  he pCell cell in
2cb20 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2cb30 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2cb40 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2cb50 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20   idx);..        
2cb60 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
2cb70 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
2cb80 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
2cb90 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
2cba0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
2cbb0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
2cbc0 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
2cbd0 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
2cbe0 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
2cbf0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
2cc00 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
2cc10 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
2cc20 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
2cc30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
2cc40 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
2cc50 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
2cc60 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
2cc70 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
2cc80 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2cc90 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
2cca0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
2ccb0 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
2ccc0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
2ccd0 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
2cce0 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
2ccf0 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
2cd00 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
2cd10 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
2cd20 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
2cd30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2cd40 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
2cd50 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
2cd60 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
2cd70 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
2cd80 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2cd90 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
2cda0 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
2cdb0 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
2cdc0 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
2cdd0 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
2cde0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2cdf0 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
2ce00 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2ce10 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2ce20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2ce30 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2ce40 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2ce50 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
2ce60 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2ce70 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2ce80 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2ce90 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
2cea0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2ceb0 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
2cec0 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
2ced0 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
2cee0 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
2cef0 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
2cf00 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
2cf10 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
2cf20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2cf30 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2cf40 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
2cf50 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2cf60 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
2cf70 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2cf80 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
2cf90 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2cfa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2cfb0 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
2cfc0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2cfd0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2cfe0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2cff0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2d000 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
2d010 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2d020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d030 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
2d040 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
2d050 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
2d060 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
2d070 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
2d080 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
2d090 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
2d0a0 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
2d0b0 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
2d0c0 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
2d0d0 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
2d0e0 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
2d0f0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2d100 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
2d110 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
2d120 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
2d130 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20  called. .       
2d140 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2d150 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  ** If the record
2d160 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65   is corrupt, the
2d170 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2d180 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64  routine may read
2d190 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70  .          ** up
2d1a0 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20   to two varints 
2d1b0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2d1c0 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65  the buffer. An e
2d1d0 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20  xtra 18 .       
2d1e0 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
2d1f0 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61  adding is alloca
2d200 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ted at the end o
2d210 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a  f the buffer in.
2d220 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
2d230 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  e this happens. 
2d240 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
2d250 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
2d260 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
2d270 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
2d280 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
2d290 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
2d2a0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
2d2b0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
2d2c0 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
2d2d0 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
2d2e0 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
2d2f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
2d300 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2d310 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20  se( nCell<0 );  
2d320 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20   /* True if key 
2d330 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20  size is 2^32 or 
2d340 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  more */.        
2d350 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2d360 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==0 );  /* Inva
2d370 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2d380 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f  x80 0x80 0x00 */
2d390 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2d3a0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b  ase( nCell==1 );
2d3b0 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2d3c0 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2d3d0 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20  0 0x01 */.      
2d3e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2d3f0 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69  ell==2 );  /* Mi
2d400 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65  nimum legal inde
2d410 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20  x key size */.  
2d420 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2d430 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<2 ){.         
2d440 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2d450 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
2d460 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
2d470 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2d480 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2d490 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d4a0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
2d4b0 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b  e3Malloc( nCell+
2d4c0 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  18 );.          
2d4d0 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
2d4e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2d4f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2d500 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2d510 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2d520 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2d530 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
2d540 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2d550 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2d560 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
2d570 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
2d580 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
2d590 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20  CellKey, 0);.   
2d5a0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2d5b0 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56  Flags &= ~BTCF_V
2d5c0 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
2d5d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2d5e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d5f0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2d600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2d610 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2d620 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d630 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2d640 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2d650 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
2d660 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2d670 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2d680 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2d690 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2d6a0 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
2d6b0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2d6c0 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
2d6d0 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
2d6e0 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
2d6f0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2d700 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
2d710 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
2d720 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
2d730 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2d740 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
2d750 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
2d760 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d770 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
2d780 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2d790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d7a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
2d7b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2d7c0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2d7d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d7e0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2d7f0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2d800 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2d810 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
2d820 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
2d830 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
2d840 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2d850 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2d860 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
2d870 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
2d880 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d890 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
2d8a0 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
2d8b0 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
2d8c0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
2d8d0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2d8e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
2d8f0 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
2d900 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2d910 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
2d920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d930 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
2d940 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2d950 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2d960 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61  pCur->ix<pCur->a
2d970 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2d980 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
2d990 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2d9a0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
2d9b0 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
2d9c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d9d0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2d9e0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
2d9f0 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2da00 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
2da10 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2da20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2da30 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2da40 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2da50 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
2da60 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
2da70 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
2da80 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
2da90 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
2daa0 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c  Cur->ix = (u16)l
2dab0 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
2dac0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
2dad0 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
2dae0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
2daf0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
2db00 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2db10 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
2db20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2db30 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2db40 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  l)==0 );.  retur
2db50 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2db60 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2db70 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2db80 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2db90 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
2dba0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
2dbb0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2dbc0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
2dbd0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2dbe0 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
2dbf0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2dc00 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
2dc10 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2dc20 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
2dc30 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2dc40 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
2dc50 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2dc60 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2dc70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2dc80 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
2dc90 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
2dca0 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
2dcb0 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
2dcc0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
2dcd0 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
2dce0 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
2dcf0 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
2dd00 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
2dd10 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
2dd20 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
2dd30 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
2dd40 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
2dd50 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
2dd60 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
2dd70 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
2dd80 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
2dd90 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d   Return an estim
2dda0 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  ate for the numb
2ddb0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2ddc0 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 43 75  e table that pCu
2ddd0 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  r is.** pointing
2dde0 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e   to.  Return a n
2ddf0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
2de00 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73  f no estimate is
2de10 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61   currently .** a
2de20 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34  vailable..*/.i64
2de30 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77   sqlite3BtreeRow
2de40 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f  CountEst(BtCurso
2de50 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20  r *pCur){.  i64 
2de60 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73  n;.  u8 i;..  as
2de70 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2de80 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2de90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2dea0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2deb0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2dec0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2ded0 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20   Currently this 
2dee0 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c  interface is onl
2def0 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  y called by the 
2df00 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a  OP_IfSmaller.  *
2df10 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74  * opcode, and it
2df20 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63   that case the c
2df30 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79  ursor will alway
2df40 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20  s be valid and. 
2df50 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   ** will always 
2df60 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20  point to a leaf 
2df70 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  node. */.  if( N
2df80 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74  EVER(pCur->eStat
2df90 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e!=CURSOR_VALID)
2dfa0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
2dfb0 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e  if( NEVER(pCur->
2dfc0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2dfd0 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20  ge]->leaf==0) ) 
2dfe0 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 66 6f  return -1;..  fo
2dff0 72 28 6e 3d 31 2c 20 69 3d 30 3b 20 69 3c 3d 70  r(n=1, i=0; i<=p
2e000 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
2e010 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d  {.    n *= pCur-
2e020 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c  >apPage[i]->nCel
2e030 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
2e040 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  n;.}../*.** Adva
2e050 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
2e060 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
2e070 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2e080 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c  . .** Return val
2e090 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c  ue:.**.**    SQL
2e0a0 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75  ITE_OK        su
2e0b0 63 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49  ccess.**    SQLI
2e0c0 54 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72  TE_DONE      cur
2e0d0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2e0e0 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c  ointing at the l
2e0f0 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20  ast element.**  
2e100 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20    otherwise     
2e110 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20     some kind of 
2e120 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a  error occurred.*
2e130 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2e140 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2e150 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
2e160 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2e170 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2e180 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2e190 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63  se of merely inc
2e1a0 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2e1b0 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2e1c0 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2e1d0 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e  the next cell on
2e1e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2e1f0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2e200 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c   btreeNext() hel
2e210 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
2e220 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2e230 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2e240 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2e250 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
2e260 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2e270 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
2e280 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20  bit 0x01 of the 
2e290 46 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71  F argument in sq
2e2a0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 43  lite3BtreeNext(C
2e2b0 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74  ,F) is 1, then t
2e2c0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72  he.** cursor cor
2e2d0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
2e2e0 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69  QL index and thi
2e2f0 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2e300 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69  have been.** ski
2e310 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20  pped if the SQL 
2e320 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61  index had been a
2e330 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2e340 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a  The F argument.*
2e350 2a 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  * is a hint to t
2e360 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53  he implement.  S
2e370 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2e380 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2e390 6e 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20  not use.** this 
2e3a0 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32  hint, but COMDB2
2e3b0 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   does..*/.static
2e3c0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2e3d0 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
2e3e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2e3f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2e400 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
2e410 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2e420 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2e430 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2e440 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2e450 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2e460 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e470 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  R_VALID );.  if(
2e480 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2e490 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2e4a0 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2e4b0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2e4c0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
2e4d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
2e4e0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2e4f0 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2e500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e510 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2e520 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2e530 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2e540 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2e550 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2e560 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
2e570 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2e580 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2e590 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2e5a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2e5b0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2e5c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2e5d0 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2e5e0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2e5f0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2e600 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2e610 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ext>0 ){.       
2e620 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2e630 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2e640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2e660 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2e670 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2e680 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2e690 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2e6a0 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
2e6b0 3e 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >ix;.  assert( p
2e6c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2e6d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
2e6e0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
2e6f0 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
2e700 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
2e710 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
2e720 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
2e730 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
2e740 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
2e750 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
2e760 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
2e770 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
2e780 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
2e790 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
2e7a0 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
2e7b0 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
2e7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2e7d0 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
2e7e0 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
2e7f0 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
2e800 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
2e810 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
2e820 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
2e830 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
2e840 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
2e850 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
2e860 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
2e870 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2e880 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2e890 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2e8a0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2e8b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2e8c0 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
2e8d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2e8e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
2e8f0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2e900 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
2e910 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2e920 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2e930 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2e940 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2e950 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
2e960 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
2e970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2e980 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2e990 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
2e9a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e9b0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2e9c0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78  }while( pCur->ix
2e9d0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2e9e0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2e9f0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2ea00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
2ea10 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
2ea20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2ea30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ea40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2ea50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2ea60 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2ea70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2ea80 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2ea90 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2eaa0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
2eab0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2eac0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2ead0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65  int flags){.  Me
2eae0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2eaf0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2eb00 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55  ( flags );  /* U
2eb10 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75  sed in COMDB2 bu
2eb20 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c  t not native SQL
2eb30 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ite */.  assert(
2eb40 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2eb50 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2eb60 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
2eb70 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20  || flags==1 );. 
2eb80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2eb90 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2eba0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ebb0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2ebc0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2ebd0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2ebe0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2ebf0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2ec00 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
2ec10 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2ec20 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74  RSOR_VALID ) ret
2ec30 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2ec40 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ur);.  pPage = p
2ec50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2ec60 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
2ec70 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50  (++pCur->ix)>=pP
2ec80 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2ec90 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20    pCur->ix--;.  
2eca0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2ecb0 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  xt(pCur);.  }.  
2ecc0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2ecd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2ece0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2ecf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2ed00 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2ed10 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ed20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
2ed30 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
2ed40 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
2ed50 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2ed60 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c  e..** Return val
2ed70 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ues:.**.**     S
2ed80 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63  QLITE_OK     suc
2ed90 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  cess.**     SQLI
2eda0 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75  TE_DONE   the cu
2edb0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2edc0 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  on the first ele
2edd0 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
2ede0 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69  e.**     otherwi
2edf0 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64  se     some kind
2ee00 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
2ee10 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
2ee20 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2ee30 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2ee40 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
2ee50 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2ee60 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2ee70 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2ee80 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
2ee90 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2eea0 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2eeb0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
2eec0 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
2eed0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2eee0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2eef0 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
2ef00 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
2ef10 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2ef20 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2ef30 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2ef40 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
2ef50 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2ef60 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
2ef70 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20  bit 0x01 of the 
2ef80 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  F argument to sq
2ef90 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2efa0 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  us(C,F) is 1, th
2efb0 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  en.** the cursor
2efc0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2efd0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2efe0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2eff0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
2f000 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
2f010 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2f020 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
2f030 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
2f040 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20  nt is a.** hint 
2f050 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
2f060 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51  .  The native SQ
2f070 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2f080 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2f090 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68  ot.** use this h
2f0a0 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
2f0b0 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
2f0c0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2f0d0 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
2f0e0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2f0f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
2f100 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
2f110 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2f120 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2f130 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2f140 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2f150 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2f160 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2f170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2f180 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2f190 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2f1a0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2f1b0 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
2f1c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2f1d0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2f1e0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2f1f0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2f200 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
2f210 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2f220 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2f230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2f250 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2f260 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2f270 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2f280 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2f290 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
2f2a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2f2b0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2f2c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2f2d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2f2e0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2f2f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f300 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2f310 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f320 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2f330 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2f340 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2f350 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2f360 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2f370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f380 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2f390 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2f3a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2f3b0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2f3c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2f3d0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2f3e0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2f3f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2f400 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2f410 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20  x = pCur->ix;.  
2f420 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2f430 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2f440 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2f450 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2f460 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f470 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2f480 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2f490 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2f4a0 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d  hile( pCur->ix==
2f4b0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2f4c0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2f4d0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2f4e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2f4f0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2f500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
2f510 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
2f520 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2f530 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2f540 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2f550 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2f560 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2f570 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2f580 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d  CF_ValidOvfl))==
2f590 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  0 );..    pCur->
2f5a0 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  ix--;.    pPage 
2f5b0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2f5c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2f5d0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2f5e0 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2f5f0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2f600 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2f610 76 69 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a  vious(pCur, 0);.
2f620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f640 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2f650 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
2f660 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2f670 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
2f680 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  r, int flags){. 
2f690 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2f6a0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2f6b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
2f6c0 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
2f6d0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2f6e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2f6f0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2f700 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f710 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2f720 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b  AMETER( flags );
2f730 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d    /* Used in COM
2f740 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69  DB2 but not nati
2f750 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70  ve SQLite */.  p
2f760 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2f770 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2f780 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2f790 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
2f7a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2f7b0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
2f7c0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2f7d0 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
2f7e0 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20  ur->ix==0.   || 
2f7f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2f800 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
2f810 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2f820 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
2f830 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43  (pCur);.  }.  pC
2f840 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75  ur->ix--;.  retu
2f850 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f860 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
2f870 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 0a 23  ERVER_EDITION..#
2f880 64 65 66 69 6e 65 20 53 45 52 56 45 52 5f 44 45  define SERVER_DE
2f890 46 41 55 4c 54 5f 46 52 45 45 4c 49 53 54 53 20  FAULT_FREELISTS 
2f8a0 20 20 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20       16.#define 
2f8b0 53 45 52 56 45 52 5f 44 45 46 41 55 4c 54 5f 46  SERVER_DEFAULT_F
2f8c0 52 45 45 4c 49 53 54 5f 53 49 5a 45 20 31 32 38  REELIST_SIZE 128
2f8d0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2f8e0 20 74 68 65 20 66 72 65 65 2d 6e 6f 64 65 20 61   the free-node a
2f8f0 6e 64 20 74 68 65 20 66 69 72 73 74 20 53 45 52  nd the first SER
2f900 56 45 52 5f 44 45 46 41 55 4c 54 5f 46 52 45 45  VER_DEFAULT_FREE
2f910 4c 49 53 54 53 20 0a 2a 2a 20 74 72 75 6e 6b 20  LISTS .** trunk 
2f920 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  pages..*/.static
2f930 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 65 72   int allocateSer
2f940 76 65 72 46 72 65 65 6e 6f 64 65 28 42 74 53 68  verFreenode(BtSh
2f950 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
2f960 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2f970 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
2f980 50 61 67 65 31 3b 0a 0a 20 20 72 63 20 3d 20 73  Page1;..  rc = s
2f990 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f9a0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
2f9b0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2f9c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
2f9d0 6e 6f 20 70 67 6e 6f 4e 6f 64 65 20 3d 20 28 2b  no pgnoNode = (+
2f9e0 2b 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  +pBt->nPage);.  
2f9f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 6f 64 65    MemPage *pNode
2fa00 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
2fa10 0a 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ..    put4byte(&
2fa20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2fa30 5d 2c 20 70 67 6e 6f 4e 6f 64 65 29 3b 0a 20 20  ], pgnoNode);.  
2fa40 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
2fa50 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
2fa60 67 6e 6f 4e 6f 64 65 2c 20 26 70 4e 6f 64 65 2c  gnoNode, &pNode,
2fa70 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
2fa80 54 45 4e 54 29 3b 0a 20 20 20 20 69 66 28 20 72  TENT);.    if( r
2fa90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2faa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fab0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 6f  e3PagerWrite(pNo
2fac0 64 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  de->pDbPage);.  
2fad0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2fae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2faf0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 6f     put4byte(&pNo
2fb00 64 65 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 30 29  de->aData[0], 0)
2fb10 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2fb20 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 34  (&pNode->aData[4
2fb30 5d 2c 20 53 45 52 56 45 52 5f 44 45 46 41 55 4c  ], SERVER_DEFAUL
2fb40 54 5f 46 52 45 45 4c 49 53 54 53 29 3b 0a 20 20  T_FREELISTS);.  
2fb50 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
2fb60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2fb70 26 20 69 3c 53 45 52 56 45 52 5f 44 45 46 41 55  & i<SERVER_DEFAU
2fb80 4c 54 5f 46 52 45 45 4c 49 53 54 53 3b 20 69 2b  LT_FREELISTS; i+
2fb90 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67  +){.      MemPag
2fba0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
2fbb0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 54 72       Pgno pgnoTr
2fbc0 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 2b  unk;.      if( +
2fbd0 2b 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e  +pBt->nPage==PEN
2fbe0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2fbf0 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
2fc00 2b 2b 3b 0a 20 20 20 20 20 20 70 67 6e 6f 54 72  ++;.      pgnoTr
2fc10 75 6e 6b 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  unk = pBt->nPage
2fc20 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ;..      rc = bt
2fc30 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
2fc40 28 70 42 74 2c 20 70 67 6e 6f 54 72 75 6e 6b 2c  (pBt, pgnoTrunk,
2fc50 20 26 70 54 72 75 6e 6b 2c 20 50 41 47 45 52 5f   &pTrunk, PAGER_
2fc60 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a  GET_NOCONTENT);.
2fc70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fc80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fc90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2fca0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2fcb0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2fcc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2fcd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fce0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54         memset(pT
2fcf0 72 75 6e 6b 2d 3e 61 44 61 74 61 2c 20 30 2c 20  runk->aData, 0, 
2fd00 38 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  8);.        put4
2fd10 62 79 74 65 28 26 70 4e 6f 64 65 2d 3e 61 44 61  byte(&pNode->aDa
2fd20 74 61 5b 38 2b 69 2a 34 5d 2c 20 70 67 6e 6f 54  ta[8+i*4], pgnoT
2fd30 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  runk);.      }. 
2fd40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2fd50 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 7d 0a  (pTrunk);.    }.
2fd60 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2fd70 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  pNode);.  }..  r
2fd80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fd90 2a 2a 20 52 65 74 75 72 6e 20 61 20 72 65 66 65  ** Return a refe
2fda0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 66 69 72  rence to the fir
2fdb0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2fdc0 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 61 74 61   one of the data
2fdd0 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 73 2e  base free-lists.
2fde0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65  .** Allocate the
2fdf0 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
2fe00 69 73 74 73 20 69 66 20 72 65 71 75 69 72 65 64  ists if required
2fe10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fe20 66 69 6e 64 53 65 72 76 65 72 54 72 75 6e 6b 28  findServerTrunk(
2fe30 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
2fe40 6e 74 20 62 41 6c 6c 6f 63 2c 20 4d 65 6d 50 61  nt bAlloc, MemPa
2fe50 67 65 20 2a 2a 70 70 54 72 75 6e 6b 29 7b 0a 20  ge **ppTrunk){. 
2fe60 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2fe70 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
2fe80 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 6f 64 65    MemPage *pNode
2fe90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2fea0 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 70 61    /* The node pa
2feb0 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
2fec0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
2fed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2fee0 65 74 75 72 6e 65 64 20 70 61 67 65 20 2a 2f 0a  eturned page */.
2fef0 20 20 50 67 6e 6f 20 69 4e 6f 64 65 3b 20 20 20    Pgno iNode;   
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff10 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2ff20 20 6f 66 20 6e 6f 64 65 20 70 61 67 65 20 2a 2f   of node page */
2ff30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ff40 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
2ff50 74 68 65 20 6e 6f 64 65 20 70 61 67 65 20 61 6e  the node page an
2ff60 64 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  d free-list trun
2ff70 6b 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  ks have not yet 
2ff80 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
2ff90 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68  allocate.  ** th
2ffa0 65 6d 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 70 50  em now.  */.  pP
2ffb0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2ffc0 65 31 3b 0a 20 20 69 4e 6f 64 65 20 3d 20 67 65  e1;.  iNode = ge
2ffd0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2ffe0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 69 66  aData[32]);.  if
2fff0 28 20 69 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ( iNode==0 ){.  
30000 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
30010 65 72 76 65 72 46 72 65 65 6e 6f 64 65 28 70 42  erverFreenode(pB
30020 74 29 3b 0a 20 20 20 20 69 4e 6f 64 65 20 3d 20  t);.    iNode = 
30030 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
30040 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
30050 7d 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  }..  /* Grab the
30060 20 6e 6f 64 65 20 70 61 67 65 20 2a 2f 0a 20 20   node page */.  
30070 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30080 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
30090 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
300a0 28 70 42 74 2c 20 69 4e 6f 64 65 2c 20 26 70 4e  (pBt, iNode, &pN
300b0 6f 64 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ode, 0);.  }.  i
300c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
300d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73   ){.    int nLis
300e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
300f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30100 6f 66 20 66 72 65 65 2d 6c 69 73 74 73 20 69 6e  of free-lists in
30110 20 74 68 69 73 20 64 62 20 2a 2f 0a 20 20 20 20   this db */.    
30120 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 54  int i;..    /* T
30130 72 79 20 74 6f 20 6c 6f 63 6b 20 61 20 66 72 65  ry to lock a fre
30140 65 2d 6c 69 73 74 20 74 72 75 6e 6b 2e 20 49 66  e-list trunk. If
30150 20 62 41 6c 6c 6f 63 20 69 73 20 74 72 75 65 2c   bAlloc is true,
30160 20 69 74 20 68 61 73 20 74 6f 20 62 65 20 61 0a   it has to be a.
30170 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
30180 20 74 72 75 6e 6b 20 77 69 74 68 20 61 74 20 6c   trunk with at l
30190 65 61 73 74 20 6f 6e 65 20 65 6e 74 72 79 20 69  east one entry i
301a0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
301b0 20 2a 2f 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20   */.    nList = 
301c0 28 69 6e 74 29 67 65 74 34 62 79 74 65 28 26 70  (int)get4byte(&p
301d0 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  Node->aData[4]);
301e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
301f0 6e 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  nList; i++){.   
30200 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d     Pgno iTrunk =
30210 20 67 65 74 34 62 79 74 65 28 26 70 4e 6f 64 65   get4byte(&pNode
30220 2d 3e 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  ->aData[8+i*4]);
30230 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
30240 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 50 61 67  E_OK==sqlite3Pag
30250 65 72 50 61 67 65 6c 6f 63 6b 28 70 42 74 2d 3e  erPagelock(pBt->
30260 70 50 61 67 65 72 2c 20 69 54 72 75 6e 6b 2c 20  pPager, iTrunk, 
30270 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
30280 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
30290 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  dPage(pBt, iTrun
302a0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
302b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
302c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 41 6c  SQLITE_OK && bAl
302d0 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  loc ){.         
302e0 20 69 66 28 20 21 67 65 74 34 62 79 74 65 28 26   if( !get4byte(&
302f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
30300 29 20 26 26 20 21 67 65 74 34 62 79 74 65 28 26  ) && !get4byte(&
30310 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
30320 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
30330 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
30340 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
30350 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
30360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30370 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
30380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
30390 20 70 54 72 75 6e 6b 20 29 20 62 72 65 61 6b 3b   pTrunk ) break;
303a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
303b0 20 20 20 20 2f 2a 20 4e 6f 20 66 72 65 65 20 70      /* No free p
303c0 61 67 65 73 20 69 6e 20 61 6e 79 20 66 72 65 65  ages in any free
303d0 2d 6c 69 73 74 2e 20 4f 72 20 70 65 72 68 61 70  -list. Or perhap
303e0 73 20 77 65 20 77 65 72 65 20 6c 6f 63 6b 65 64  s we were locked
303f0 20 6f 75 74 2e 20 49 6e 20 0a 20 20 20 20 2a 2a   out. In .    **
30400 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 72   either case, tr
30410 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 6f  y to allocate mo
30420 72 65 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  re from the end 
30430 6f 66 20 74 68 65 20 66 69 6c 65 20 6e 6f 77 2e  of the file now.
30440 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d    */.    if( i==
30450 6e 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  nList ){.      a
30460 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
30470 45 5f 4f 4b 20 26 26 20 70 54 72 75 6e 6b 3d 3d  E_OK && pTrunk==
30480 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
30490 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
304a0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
304b0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  e);.      for(i=
304c0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
304d0 20 26 26 20 69 3c 6e 4c 69 73 74 3b 20 69 2b 2b   && i<nList; i++
304e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ){.        /* Ad
304f0 64 20 73 6f 6d 65 20 66 72 65 65 20 70 61 67 65  d some free page
30500 73 20 74 6f 20 65 61 63 68 20 66 72 65 65 2d 6c  s to each free-l
30510 69 73 74 2e 20 4e 6f 20 73 65 72 76 65 72 2d 6c  ist. No server-l
30520 6f 63 6b 73 20 61 72 65 20 72 65 71 75 69 72 65  ocks are require
30530 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
30540 64 6f 20 74 68 69 73 20 61 73 20 77 65 20 68 61  do this as we ha
30550 76 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ve a write-lock 
30560 6f 6e 20 70 61 67 65 20 31 20 2d 20 67 75 61 72  on page 1 - guar
30570 61 6e 74 65 65 69 6e 67 0a 20 20 20 20 20 20 20  anteeing.       
30580 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
30590 63 65 73 73 20 74 6f 20 74 68 65 20 64 62 20 66  cess to the db f
305a0 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ile.  */.       
305b0 20 4d 65 6d 50 61 67 65 20 2a 70 54 20 3d 20 30   MemPage *pT = 0
305c0 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
305d0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
305e0 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 38  (&pNode->aData[8
305f0 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
30600 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
30610 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72  sedPage(pBt, iTr
30620 75 6e 6b 2c 20 26 70 54 2c 20 30 29 3b 0a 20 20  unk, &pT, 0);.  
30630 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30650 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30660 33 50 61 67 65 72 57 72 69 74 65 28 70 54 2d 3e  3PagerWrite(pT->
30670 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30680 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
30690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
306a0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
306b0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
306c0 54 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  T->aData[4]);.  
306d0 20 20 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f          for(/*no
306e0 2d 6f 70 2a 2f 3b 20 69 50 67 3c 53 45 52 56 45  -op*/; iPg<SERVE
306f0 52 5f 44 45 46 41 55 4c 54 5f 46 52 45 45 4c 49  R_DEFAULT_FREELI
30700 53 54 5f 53 49 5a 45 3b 20 69 50 67 2b 2b 29 7b  ST_SIZE; iPg++){
30710 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30720 20 2b 2b 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50   ++pBt->nPage==P
30730 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
30740 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
30750 67 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ge++;.          
30760 20 20 70 75 74 34 62 79 74 65 28 26 70 54 2d 3e    put4byte(&pT->
30770 61 44 61 74 61 5b 38 2b 69 50 67 2a 34 5d 2c 20  aData[8+iPg*4], 
30780 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
30790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
307a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 2d     put4byte(&pT-
307b0 3e 61 44 61 74 61 5b 34 5d 2c 20 69 50 67 29 3b  >aData[4], iPg);
307c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
307d0 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  Trunk==0 ){.    
307e0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
307f0 20 70 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20   pT;.           
30800 20 70 54 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pT = 0;.       
30810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30820 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30830 67 65 28 70 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ge(pT);.      }.
30840 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30850 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30860 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
30870 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
30880 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
30890 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  edPage(pBt, pBt-
308a0 3e 6e 50 61 67 65 2c 20 26 70 4c 61 73 74 2c 20  >nPage, &pLast, 
308b0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
308c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
308d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
308e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
308f0 65 28 70 4c 61 73 74 2d 3e 70 44 62 50 61 67 65  e(pLast->pDbPage
30900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
30910 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 29 3b  easePage(pLast);
30920 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
30930 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 50  yte(28 + (u8*)pP
30940 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
30950 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
30960 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30970 7d 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65  }.  }..  release
30980 50 61 67 65 28 70 4e 6f 64 65 29 3b 0a 20 20 69  Page(pNode);.  i
30990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
309a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
309b0 70 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 72 63  pTrunk );.    rc
309c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
309d0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
309e0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
309f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30a00 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
30a10 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 70  e(pTrunk);.    p
30a20 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trunk = 0;.  }. 
30a30 20 2a 70 70 54 72 75 6e 6b 20 3d 20 70 54 72 75   *ppTrunk = pTru
30a40 6e 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  nk;.  return rc;
30a50 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
30a60 6c 6c 6f 63 61 74 65 53 65 72 76 65 72 50 61 67  llocateServerPag
30a70 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
30a80 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
30a90 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
30aa0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
30ab0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
30ac0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
30ad0 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
30ae0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
30af0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
30b00 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
30b10 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
30b20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
30b30 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
30b40 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
30b50 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
30b60 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
30b70 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
30b80 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
30b90 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
30ba0 4e 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  NY */.){.  int r
30bb0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
30bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30bd0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
30be0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
30bf0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
30c00 2a 20 54 68 65 20 6e 6f 64 65 20 70 61 67 65 20  * The node page 
30c10 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
30c20 77 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  w = 0;..#ifdef S
30c30 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
30c40 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
30c50 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
30c60 74 2d 3e 70 50 61 67 65 72 29 3b 0a 23 65 6e 64  t->pPager);.#end
30c70 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4d  if..  assert( eM
30c80 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
30c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
30ca0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
30cb0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
30cc0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
30cd0 20 20 72 63 20 3d 20 66 69 6e 64 53 65 72 76 65    rc = findServe
30ce0 72 54 72 75 6e 6b 28 70 42 74 2c 20 31 2c 20 26  rTrunk(pBt, 1, &
30cf0 70 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72  pTrunk);.  if( r
30d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30d10 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20      int nFree;  
30d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30d30 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
30d40 67 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e  ges on this trun
30d50 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6e 46  k page */.    nF
30d60 72 65 65 20 3d 20 28 69 6e 74 29 67 65 74 34 62  ree = (int)get4b
30d70 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
30d80 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
30d90 6e 46 72 65 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nFree==0 ){.    
30da0 20 20 70 67 6e 6f 4e 65 77 20 3d 20 67 65 74 34    pgnoNew = get4
30db0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
30dc0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 61  ata[0]);.      a
30dd0 73 73 65 72 74 28 20 70 67 6e 6f 4e 65 77 20 29  ssert( pgnoNew )
30de0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30df0 20 20 20 6e 46 72 65 65 2d 2d 3b 0a 20 20 20 20     nFree--;.    
30e00 20 20 70 67 6e 6f 4e 65 77 20 3d 20 67 65 74 34    pgnoNew = get4
30e10 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
30e20 61 74 61 5b 38 2b 34 2a 6e 46 72 65 65 5d 29 3b  ata[8+4*nFree]);
30e30 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
30e40 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
30e50 5d 2c 20 28 75 33 32 29 6e 46 72 65 65 29 3b 0a  ], (u32)nFree);.
30e60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30e70 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  e(pTrunk);.     
30e80 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
30e90 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
30ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30eb0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
30ec0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
30ed0 61 67 73 20 3d 20 70 54 72 75 6e 6b 20 3f 20 30  ags = pTrunk ? 0
30ee0 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   : PAGER_GET_NOC
30ef0 4f 4e 54 45 4e 54 3b 0a 20 20 20 20 72 63 20 3d  ONTENT;.    rc =
30f00 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
30f10 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  age(pBt, pgnoNew
30f20 2c 20 26 70 4e 65 77 2c 20 66 6c 61 67 73 29 3b  , &pNew, flags);
30f30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
30f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30f50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30f60 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
30f70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
30f80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30f90 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
30fa0 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 20  ePage(pNew);.   
30fb0 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20       pNew = 0;. 
30fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
30fd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30fe0 4f 4b 20 26 26 20 70 54 72 75 6e 6b 20 29 7b 0a  OK && pTrunk ){.
30ff0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 72        memcpy(pTr
31000 75 6e 6b 2d 3e 61 44 61 74 61 2c 20 70 4e 65 77  unk->aData, pNew
31010 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 75 73  ->aData, pBt->us
31020 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ableSize);.    }
31030 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
31040 4e 65 77 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  New;.    *pPgno 
31050 3d 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 7d 0a 0a  = pgnoNew;.  }..
31060 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
31070 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
31080 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
31090 3d 3d 28 2a 70 70 50 61 67 65 21 3d 30 29 20 29  ==(*ppPage!=0) )
310a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
310b0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
310c0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 28  (pBt->pPager)==(
310d0 6e 52 65 66 2b 28 2a 70 70 50 61 67 65 21 3d 30  nRef+(*ppPage!=0
310e0 29 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  )) );.  return r
310f0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
31100 20 66 72 65 65 53 65 72 76 65 72 50 61 67 65 32   freeServerPage2
31110 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
31120 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
31130 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 69  Pgno iPage){.  i
31140 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
31150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31160 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
31170 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
31180 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
31190 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 70     /* The node p
311a0 61 67 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  age */.#ifdef SQ
311b0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74  LITE_DEBUG.  int
311c0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
311d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
311e0 2d 3e 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69  ->pPager);.#endi
311f0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  f..  assert( sql
31200 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
31210 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
31220 20 72 63 20 3d 20 66 69 6e 64 53 65 72 76 65 72   rc = findServer
31230 54 72 75 6e 6b 28 70 42 74 2c 20 30 2c 20 26 70  Trunk(pBt, 0, &p
31240 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
31250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31260 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
31270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31280 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67  mber of free pag
31290 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b  es on this trunk
312a0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6e 46 72   page */.    nFr
312b0 65 65 20 3d 20 28 69 6e 74 29 67 65 74 34 62 79  ee = (int)get4by
312c0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
312d0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  a[4]);.    if( n
312e0 46 72 65 65 3e 3d 28 28 70 42 74 2d 3e 75 73 61  Free>=((pBt->usa
312f0 62 6c 65 53 69 7a 65 20 2f 20 34 29 20 2d 20 32  bleSize / 4) - 2
31300 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
31310 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
31320 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31330 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31340 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
31350 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
31360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
31370 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
31380 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  DbPage);.      }
31390 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
313a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
313b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
313c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
313d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
313e0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
313f0 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 61  aData, pTrunk->a
31400 44 61 74 61 2c 20 70 42 74 2d 3e 75 73 61 62 6c  Data, pBt->usabl
31410 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
31420 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
31430 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 50 61 67  ->aData[0], iPag
31440 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
31450 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
31460 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  ata[4], 0);.    
31470 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
31480 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
31490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
314a0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
314b0 3e 61 44 61 74 61 5b 38 2b 6e 46 72 65 65 2a 34  >aData[8+nFree*4
314c0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
314d0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
314e0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 28 75 33  k->aData[4], (u3
314f0 32 29 6e 46 72 65 65 2b 31 29 3b 0a 20 20 20 20  2)nFree+1);.    
31500 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
31510 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 0a  e(pTrunk);.  }..
31520 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
31530 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
31540 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
31550 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
31560 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  ;.}..#else.# def
31570 69 6e 65 20 61 6c 6c 6f 63 61 74 65 53 65 72 76  ine allocateServ
31580 65 72 50 61 67 65 28 76 2c 20 77 2c 20 78 2c 20  erPage(v, w, x, 
31590 79 2c 20 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  y, z) SQLITE_OK.
315a0 23 20 64 65 66 69 6e 65 20 66 72 65 65 53 65 72  # define freeSer
315b0 76 65 72 50 61 67 65 32 28 78 2c 20 79 2c 20 7a  verPage2(x, y, z
315c0 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
315d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 45 52  if /* SQLITE_SER
315e0 56 45 52 5f 45 44 49 54 49 4f 4e 20 2a 2f 0a 0a  VER_EDITION */..
315f0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
31600 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
31610 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31620 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
31630 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
31640 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
31650 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
31660 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
31670 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
31680 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
31690 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
316a0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
316b0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
316c0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
316d0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
316e0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
316f0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
31700 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
31710 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
31720 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
31730 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
31740 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
31750 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
31760 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
31770 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
31780 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
31790 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
317a0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
317b0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
317c0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
317d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
317e0 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
317f0 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
31800 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
31810 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
31820 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
31830 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
31840 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
31850 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
31860 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
31870 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
31880 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
31890 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
318a0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
318b0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
318c0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
318d0 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
318e0 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
318f0 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
31900 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
31910 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
31920 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
31930 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
31940 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
31950 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
31960 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
31970 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
31980 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
31990 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
319a0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
319b0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
319c0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
319d0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
319e0 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
319f0 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
31a00 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
31a10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
31a20 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
31a30 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
31a40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
31a50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
31a60 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
31a70 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
31a80 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
31a90 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
31aa0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
31ab0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
31ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
31ad0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
31ae0 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
31af0 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
31b00 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
31b10 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
31b20 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
31b30 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
31b40 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
31b50 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
31b60 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
31b70 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
31b80 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
31b90 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
31ba0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
31bb0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
31bc0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
31bd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
31be0 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
31bf0 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
31c00 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
31c10 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
31c20 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
31c30 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
31c40 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
31c50 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
31c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
31c70 0a 0a 20 20 69 66 28 20 62 74 72 65 65 46 72 65  ..  if( btreeFre
31c80 65 6c 69 73 74 46 6f 72 6d 61 74 32 28 70 42 74  elistFormat2(pBt
31c90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
31ca0 61 6c 6c 6f 63 61 74 65 53 65 72 76 65 72 50 61  allocateServerPa
31cb0 67 65 28 70 42 74 2c 20 70 70 50 61 67 65 2c 20  ge(pBt, ppPage, 
31cc0 70 50 67 6e 6f 2c 20 6e 65 61 72 62 79 2c 20 65  pPgno, nearby, e
31cd0 4d 6f 64 65 29 3b 20 0a 20 20 7d 0a 0a 20 20 61  Mode); .  }..  a
31ce0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31cf0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
31d00 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
31d10 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  t( eMode==BTALLO
31d20 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79  C_ANY || (nearby
31d30 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41  >0 && IfNotOmitA
31d40 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  V(pBt->autoVacuu
31d50 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20  m)) );.  pPage1 
31d60 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
31d70 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50   mxPage = btreeP
31d80 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
31d90 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
31da0 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54   R-05119-02637 T
31db0 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  he 4-byte big-en
31dc0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20  dian integer at 
31dd0 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73  offset 36.  ** s
31de0 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65  tores stores the
31df0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
31e00 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
31e10 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d  eelist. */.  n =
31e20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
31e30 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
31e40 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
31e50 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
31e60 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
31e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
31e80 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
31e90 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
31ea0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
31eb0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
31ec0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
31ed0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
31ee0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
31ef0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
31f00 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
31f10 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
31f20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
31f30 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
31f40 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68  .    u32 nSearch
31f50 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74   = 0;   /* Count
31f60 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
31f70 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74  f search attempt
31f80 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  s */.    .    /*
31f90 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
31fa0 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
31fb0 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
31fc0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
31fd0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
31fe0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
31ff0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
32000 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
32010 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
32020 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
32030 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
32040 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
32050 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32060 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32070 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
32080 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20  LOC_EXACT ){.   
32090 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
320a0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
320b0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
320c0 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
320d0 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  y>0 );.        a
320e0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
320f0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
32100 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
32110 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
32120 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
32130 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32140 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66  n rc;.        if
32150 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
32160 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
32170 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
32180 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
32190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
321a0 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41  e if( eMode==BTA
321b0 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
321c0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
321d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
321e0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
321f0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
32200 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
32210 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
32220 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
32230 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
32240 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
32250 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
32260 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
32270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32280 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
32290 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
322a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
322b0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
322c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
322d0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
322e0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
322f0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
32300 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
32310 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
32320 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
32330 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
32340 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
32350 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
32360 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
32370 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
32380 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
32390 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
323a0 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
323b0 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20  LLOC_EXACT).    
323c0 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61  ** or until a pa
323d0 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65  ge less than 'ne
323e0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
323f0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
32400 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _LT).    */.    
32410 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
32420 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
32430 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
32440 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
32450 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
32460 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68  R-01506-11053 Th
32470 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
32480 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
32490 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20  unk page.       
324a0 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20   ** is the page 
324b0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
324c0 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  xt freelist trun
324d0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  k page in the li
324e0 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  st or.        **
324f0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73   zero if this is
32500 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69   the last freeli
32510 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a  st trunk page. *
32520 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
32530 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
32540 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
32550 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
32560 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
32570 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31  ENCE-OF: R-59841
32580 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74  -13798 The 4-byt
32590 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
325a0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
325b0 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  2.        ** sto
325c0 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  res the page num
325d0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
325e0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65   page of the fre
325f0 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69  elist, or zero i
32600 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
32610 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
32620 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ty. */.        i
32630 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
32640 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
32650 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
32660 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
32670 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
32680 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
32690 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72  >mxPage || nSear
326a0 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20  ch++ > n ){.    
326b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
326c0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72  CORRUPT_PGNO(pPr
326d0 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54  evTrunk ? pPrevT
326e0 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b  runk->pgno : 1);
326f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32700 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
32710 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
32720 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
32730 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
32740 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32750 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
32760 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
32770 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32780 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
32790 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
327a0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
327b0 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
327c0 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  ta!=0 );.      /
327d0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
327e0 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65  -13523-04394 The
327f0 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20   second integer 
32800 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
32810 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a  unk page.      *
32820 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
32830 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69  of leaf page poi
32840 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e  nters to follow.
32850 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   */.      k = ge
32860 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
32870 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
32880 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
32890 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
328a0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
328b0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
328c0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
328d0 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
328e0 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
328f0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
32900 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
32910 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
32920 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
32930 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
32940 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
32950 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
32960 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
32970 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32980 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
32990 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
329a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
329b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
329c0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
329d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
329e0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
329f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
32a00 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
32a10 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
32a20 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
32a30 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
32a40 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
32a50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
32a60 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
32a70 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
32a80 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
32a90 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
32aa0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
32ab0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
32ac0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
32ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
32ae0 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
32af0 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
32b00 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
32b10 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
32b20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
32b30 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
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 23 69 66  locate_page;.#if
32b60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32b70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
32b80 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
32b90 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
32ba0 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d      && (nearby==
32bb0 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e  iTrunk || (iTrun
32bc0 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  k<nearby && eMod
32bd0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
32be0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
32bf0 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
32c00 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
32c10 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
32c20 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
32c30 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
32c40 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
32c50 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
32c60 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
32c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32c80 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
32c90 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
32ca0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
32cb0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
32cc0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
32cd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32ce0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
32cf0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
32d00 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
32d10 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
32d20 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
32d30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
32d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
32d50 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
32d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
32d70 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
32d80 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
32d90 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
32da0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
32db0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
32dc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32dd0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
32de0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32df0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32e00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32e10 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32e20 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
32e40 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
32e50 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
32e60 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
32e70 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
32e80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32ea0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
32eb0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
32ec0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
32ed0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
32ee0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
32ef0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
32f00 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
32f10 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
32f20 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
32f30 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
32f40 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
32f50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32f60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
32f70 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
32f80 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
32f90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
32fa0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
32fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
32fc0 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
32fd0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
32fe0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
32ff0 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b  PT_PGNO(iTrunk);
33000 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
33010 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
33020 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
33030 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
33040 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
33050 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
33060 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
33070 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
33080 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
33090 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
330a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
330b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
330c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
330d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
330e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
330f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33100 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
33110 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
33120 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
33130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33140 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
33150 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
33160 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
33170 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
33180 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
33190 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
331a0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
331b0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
331c0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
331d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
331e0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
331f0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
33200 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
33210 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
33220 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
33230 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
33240 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
33250 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
33260 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
33270 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
33280 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
33290 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
332a0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
332b0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
332c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
332d0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
332e0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
332f0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
33300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33310 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33320 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33330 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
33340 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
33350 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
33360 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
33370 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
33380 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
33390 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
333a0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
333b0 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
333c0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
333d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
333e0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
333f0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
33400 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
33410 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
33420 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
33430 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
33440 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
33450 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
33460 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
33470 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
33480 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
33490 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
334a0 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
334b0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
334c0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
334d0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
334e0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
334f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
33500 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
33510 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
33520 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
33530 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
33540 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
33550 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
33560 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
33570 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
33580 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
33590 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
335a0 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
335b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
335c0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
335d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
335e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
335f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
33600 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
33610 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
33620 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
33630 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
33640 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
33650 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
33660 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
33670 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
33680 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
33690 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
336a0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
336b0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
336c0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
336d0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
336e0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
336f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
33700 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33720 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
33730 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33750 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
33760 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
33770 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
33780 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
33790 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
337a0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
337b0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
337c0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
337d0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
337e0 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
337f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
33800 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
33810 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
33820 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
33830 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
33840 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
33860 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
33870 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
33880 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
33890 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
338a0 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
338b0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
338c0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
338d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
338e0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
338f0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
33900 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
33910 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
33920 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
33930 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
33940 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
33950 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
33960 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
33970 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
33980 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
33990 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
339a0 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
339b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
339c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
339d0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
339e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
339f0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
33a00 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
33a10 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
33a20 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
33a30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
33a40 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
33a50 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
33a60 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
33a70 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
33a80 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
33a90 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
33aa0 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
33ab0 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
33ac0 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47  Bt, *pPgno)? PAG
33ad0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
33ae0 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
33af0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
33b00 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
33b10 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
33b20 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
33b30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33b60 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
33b70 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
33b80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
33b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
33bb0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
33bc0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
33bd0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
33be0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
33bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33c00 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
33c10 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
33c20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
33c30 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
33c40 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
33c50 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
33c60 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
33c70 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
33c80 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
33c90 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
33ca0 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65  reelist, so appe
33cb0 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  nd a new page to
33cc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
33cd0 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
33ce0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c  **.    ** Normal
33cf0 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c  ly, new pages al
33d00 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
33d10 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71  block can be req
33d20 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  uested from the.
33d30 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79      ** pager lay
33d40 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
33d50 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
33d60 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  t. This prevents
33d70 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
33d80 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
33d90 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20   read the pages 
33da0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
33db0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
33dc0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
33dd0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  t transaction ha
33de0 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e  s already run on
33df0 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d  e or more increm
33e00 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20  ental-vacuum.   
33e10 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20   ** steps, then 
33e20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
33e30 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74  about to allocat
33e40 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f  e may contain co
33e50 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  ntent.    ** tha
33e60 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  t is required in
33e70 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
33e80 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  rollback. In thi
33e90 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a  s case, do.    *
33ea0 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f  * not set the no
33eb0 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54  -content flag. T
33ec0 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70  his causes the p
33ed0 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64  ager to load and
33ee0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
33ef0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
33f00 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20   content before 
33f10 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a  overwriting it..
33f20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
33f30 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
33f40 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  r will not actua
33f50 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  lly attempt to l
33f60 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a  oad or journal .
33f70 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
33f80 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  or any page that
33f90 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65   really does lie
33fa0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
33fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
33fc0 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73    ** file on dis
33fd0 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74  k. So the effect
33fe0 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74  s of disabling t
33ff0 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70  he no-content op
34000 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
34010 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69  * here are confi
34020 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67  ned to those pag
34030 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77  es that lie betw
34040 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
34050 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
34060 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65  se image and the
34070 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
34080 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
34090 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e  /.    int bNoCon
340a0 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74  tent = (0==IfNot
340b0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
340c0 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52  runcate))? PAGER
340d0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30  _GET_NOCONTENT:0
340e0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
340f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
34100 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
34110 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
34120 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34130 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
34140 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
34150 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
34160 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
34170 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
34180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34190 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
341a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
341b0 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
341c0 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
341d0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
341e0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
341f0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
34200 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
34210 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
34220 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
34230 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
34240 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
34250 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
34260 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
34270 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
34280 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
34290 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
342a0 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
342b0 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
342c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
342d0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
342e0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
342f0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
34300 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
34310 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
34320 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
34330 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
34340 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34350 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
34360 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
34370 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  edPage(pBt, pBt-
34380 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e  >nPage, &pPg, bN
34390 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
343a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
343b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
343c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
343d0 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
343e0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
343f0 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
34400 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34410 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
34420 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
34430 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ++;.      if( pB
34440 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
34450 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
34460 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b   ){ pBt->nPage++
34470 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
34480 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38  .    put4byte(28
34490 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61   + (u8*)pBt->pPa
344a0 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  ge1->aData, pBt-
344b0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50  >nPage);.    *pP
344c0 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  gno = pBt->nPage
344d0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  ;..    assert( *
344e0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
344f0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
34500 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
34510 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
34520 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
34530 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
34540 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
34550 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
34560 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34570 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
34580 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
34590 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
345a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
345b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
345c0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
345d0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
345e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
345f0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
34600 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
34610 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
34620 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
34630 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
34640 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
34650 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
34660 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
34670 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
34680 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  k);.  assert( rc
34690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
346a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
346b0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
346c0 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29  )->pDbPage)<=1 )
346d0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
346e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70  SQLITE_OK || (*p
346f0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
34700 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
34710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
34720 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
34730 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
34740 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
34750 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
34760 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
34770 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
34780 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
34790 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
347a0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
347b0 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
347c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
347d0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
347e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
347f0 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
34800 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
34810 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
34820 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
34830 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
34840 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
34850 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
34860 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
34870 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
34880 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
34890 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
348a0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
348b0 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
348c0 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
348d0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
348e0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
348f0 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
34900 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
34910 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
34920 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
34930 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
34940 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
34950 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
34960 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
34970 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
34980 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
34990 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
349a0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
349b0 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
349c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
349e0 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
349f0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
34a00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
34a10 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
34a20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
34a30 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
34a40 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
34a50 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
34a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
34a70 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
34a80 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
34a90 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
34aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ab0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
34ac0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
34ad0 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
34ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34af0 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
34b00 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
34b10 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
34b20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
34b30 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
34b40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
34b50 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61  ORRUPT_DB || iPa
34b60 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
34b70 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
34b80 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
34b90 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69  Page );..  if( i
34ba0 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20  Page<2 ) return 
34bb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34bc0 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50  KPT;.  if( pMemP
34bd0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
34be0 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
34bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
34c00 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34c10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
34c20 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
34c30 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
34c40 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  e);.  }..  if( p
34c50 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
34c60 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
34c70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
34c80 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
34c90 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
34ca0 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
34cb0 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
34cc0 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
34cd0 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
34ce0 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
34cf0 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
34d00 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
34d10 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
34d20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
34d30 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
34d40 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
34d50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34d60 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
34d70 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
34d80 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34d90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
34da0 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
34db0 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
34dc0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
34dd0 20 20 0a 20 20 69 66 28 20 62 74 72 65 65 46 72    .  if( btreeFr
34de0 65 65 6c 69 73 74 46 6f 72 6d 61 74 32 28 70 42  eelistFormat2(pB
34df0 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  t) ){.    rc = f
34e00 72 65 65 53 65 72 76 65 72 50 61 67 65 32 28 70  reeServerPage2(p
34e10 42 74 2c 20 70 50 61 67 65 2c 20 69 50 61 67 65  Bt, pPage, iPage
34e20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  );.    goto free
34e30 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
34e40 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
34e50 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
34e60 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
34e70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34e80 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
34e90 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
34ea0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
34eb0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
34ec0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
34ed0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
34ee0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
34ef0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
34f00 46 72 65 65 2b 31 29 3b 0a 0a 20 20 2f 2a 20 49  Free+1);..  /* I
34f10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
34f20 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
34f30 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
34f40 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
34f50 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
34f60 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
34f70 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
34f80 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
34f90 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
34fa0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
34fb0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
34fc0 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
34fd0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34fe0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34ff0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
35000 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
35010 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
35020 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
35030 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
35040 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
35050 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
35060 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
35070 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
35080 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
35090 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
350a0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
350b0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
350c0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
350d0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
350e0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
350f0 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
35100 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
35110 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
35120 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
35130 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
35140 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
35150 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
35160 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
35170 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
35180 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
35190 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
351a0 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
351b0 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
351c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
351d0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
351e0 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
351f0 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
35200 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
35210 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35220 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
35230 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
35240 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
35250 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
35260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35270 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
35280 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
35290 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
352a0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
352b0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
352c0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
352d0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
352e0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
352f0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
35300 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
35310 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
35320 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
35330 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
35340 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
35350 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
35360 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
35370 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
35380 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
35390 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
353a0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
353b0 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
353c0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
353d0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
353e0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
353f0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
35400 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
35410 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
35420 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
35430 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
35440 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
35450 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
35460 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
35470 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
35480 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
35490 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
354a0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
354b0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
354c0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
354d0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
354e0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
354f0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
35500 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
35510 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
35520 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
35530 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
35540 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
35550 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
35560 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
35570 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
35580 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
35590 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
355a0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
355b0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
355c0 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
355d0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
355e0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
355f0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
35600 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
35610 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
35620 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
35630 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
35640 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
35650 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
35660 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
35670 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
35680 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
35690 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
356a0 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
356b0 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
356c0 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
356d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
356e0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
356f0 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
35700 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
35710 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
35720 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
35730 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
35740 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
35750 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
35760 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
35770 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
35780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
35790 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
357a0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
357b0 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
357c0 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
357d0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
357e0 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
357f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35800 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
35810 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
35820 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35840 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
35850 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
35860 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
35870 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
35880 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
35890 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
358a0 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
358b0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
358c0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
358d0 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
358e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
358f0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
35900 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
35910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
35920 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
35930 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
35940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35950 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
35960 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
35970 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
35980 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
35990 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
359a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
359b0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
359c0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
359d0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
359e0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
359f0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
35a00 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
35a10 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
35a20 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
35a30 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
35a40 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
35a50 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
35a60 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
35a70 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
35a80 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
35a90 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
35aa0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
35ab0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
35ac0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
35ad0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
35ae0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
35af0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
35b00 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
35b10 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
35b20 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
35b30 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
35b40 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
35b50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
35b60 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
35b70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
35b80 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
35b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35ba0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
35bb0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
35bc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35bd0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
35be0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
35bf0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
35c00 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
35c10 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
35c20 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
35c30 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
35c40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
35c50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
35c60 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
35c70 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
35c80 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
35c90 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
35ca0 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
35cb0 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
35cc0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
35cd0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
35ce0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
35cf0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
35d00 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
35d10 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
35d20 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
35d30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
35d40 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
35d50 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
35d60 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
35d70 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
35d80 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
35d90 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
35da0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
35db0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
35dc0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35dd0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
35de0 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
35df0 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
35e00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
35e10 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
35e20 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
35e30 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
35e40 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
35e50 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
35e60 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
35e70 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
35e80 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
35e90 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
35ea0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
35eb0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
35ec0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
35ed0 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
35ee0 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
35ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
35f00 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
35f10 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  out the cell */.
35f20 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
35f30 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  Bt;.  Pgno ovflP
35f40 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
35f50 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
35f60 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
35f70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35f80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
35f90 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
35fa0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
35fb0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
35fc0 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
35fd0 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  if( pInfo->nLoca
35fe0 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  l==pInfo->nPaylo
35ff0 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ad ){.    return
36000 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
36010 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
36020 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
36030 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
36040 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
36050 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  ell+pInfo->nSize
36060 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  -1 > pPage->aDat
36070 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
36080 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c  e ){.    /* Cell
36090 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
360a0 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 20  d of page */.   
360b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
360c0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
360d0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  e->pgno);.  }.  
360e0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
360f0 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66  yte(pCell + pInf
36100 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20  o->nSize - 4);. 
36110 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
36120 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  t;.  assert( pBt
36130 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
36140 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
36150 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
36160 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
36170 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79  l = (pInfo->nPay
36180 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c  load - pInfo->nL
36190 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
361a0 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
361b0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
361c0 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20   nOvfl>0 || .   
361d0 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20   (CORRUPT_DB && 
361e0 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  (pInfo->nPayload
361f0 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29   + ovflPageSize)
36200 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20  <ovflPageSize). 
36210 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
36220 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
36230 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
36240 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
36250 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
36260 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
36270 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
36280 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
36290 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
362a0 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
362b0 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
362c0 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
362d0 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
362e0 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
362f0 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
36300 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
36310 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
36320 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
36330 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
36340 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36350 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
36360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36370 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
36380 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
36390 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
363a0 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
363b0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
363c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
363d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70    }..    if( ( p
363e0 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20  Ovfl || ((pOvfl 
363f0 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
36400 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29  p(pBt, ovflPgno)
36410 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20  )!=0) ).     && 
36420 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
36430 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e  Refcount(pOvfl->
36440 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20  pDbPage)!=1.    
36450 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
36460 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61  e is no reason a
36470 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64  ny cursor should
36480 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e   have an outstan
36490 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a  ding reference .
364a0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f        ** to an o
364b0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c  verflow page bel
364c0 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c  onging to a cell
364d0 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64   that is being d
364e0 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a  eleted/updated..
364f0 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74        ** So if t
36500 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65  here exists more
36510 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65   than one refere
36520 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  nce to this page
36530 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20  , then it .     
36540 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61   ** must not rea
36550 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  lly be an overfl
36560 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  ow page and the 
36570 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
36580 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20   corrupt. .     
36590 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75   ** It is helpfu
365a0 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73  l to detect this
365b0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
365c0 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20  freePage2(), as 
365d0 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61  .      ** freePa
365e0 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74  ge2() may zero t
365f0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
36600 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74   if secure-delet
36610 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20  e mode is.      
36620 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
36630 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70  his 'overflow' p
36640 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
36650 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68  e a page that th
36660 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65  e.      ** calle
36670 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74  r is iterating t
36680 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20  hrough or using 
36690 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61  in some other wa
366a0 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  y, this.      **
366b0 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61   can be problema
366c0 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tic..      */.  
366d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
366e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
366f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
36700 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
36710 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
36720 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
36730 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
36740 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36750 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
36760 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
36770 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
36780 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
36790 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
367a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
367b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
367c0 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
367d0 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
367e0 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
367f0 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
36800 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
36810 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
36820 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
36830 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
36840 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
36850 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
36860 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
36870 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
36880 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
36890 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
368a0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
368b0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
368c0 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
368d0 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
368e0 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
368f0 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
36900 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
36910 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
36920 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
36930 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
36940 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
36950 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
36960 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
36970 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
36980 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
36990 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
369a0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
369b0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
369c0 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
369d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
369e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369f0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
36a00 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
36a10 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
36a20 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
36a30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
36a40 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
36a50 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42  ell */.  const B
36a60 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c  treePayload *pX,
36a70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f          /* Paylo
36a80 61 64 20 77 69 74 68 20 77 68 69 63 68 20 74 6f  ad with which to
36a90 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63   construct the c
36aa0 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ell */.  int *pn
36ab0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
36ac0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
36ad0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
36ae0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
36af0 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
36b00 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
36b10 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
36b20 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
36b30 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
36b40 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
36b50 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
36b60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
36b70 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
36b80 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
36b90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
36ba0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
36bb0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
36bc0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
36bd0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
36be0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
36bf0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
36c00 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
36c10 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
36c20 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
36c30 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
36c40 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
36c50 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
36c60 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
36c70 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
36c80 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
36c90 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
36ca0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
36cb0 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
36cc0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
36cd0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
36ce0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
36cf0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
36d00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
36d10 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
36d20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
36d30 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68  ader = pPage->ch
36d40 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66  ildPtrSize;.  if
36d50 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
36d60 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  ){.    nPayload 
36d70 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58  = pX->nData + pX
36d80 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72  ->nZero;.    pSr
36d90 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20  c = pX->pData;. 
36da0 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44     nSrc = pX->nD
36db0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
36dc0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
36dd0 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43  af ); /* fillInC
36de0 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65  ell() only calle
36df0 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a  d for leaves */.
36e00 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
36e10 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  utVarint32(&pCel
36e20 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79  l[nHeader], nPay
36e30 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64  load);.    nHead
36e40 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
36e50 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
36e60 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65   *(u64*)&pX->nKe
36e70 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
36e80 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65   assert( pX->nKe
36e90 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26 26  y<=0x7fffffff &&
36ea0 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a   pX->pKey!=0 );.
36eb0 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c      nSrc = nPayl
36ec0 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e  oad = (int)pX->n
36ed0 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
36ee0 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48  pX->pKey;.    nH
36ef0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
36f00 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61  nt32(&pCell[nHea
36f10 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  der], nPayload);
36f20 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  .  }.  .  /* Fil
36f30 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
36f40 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   */.  if( nPaylo
36f50 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
36f60 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e  cal ){.    n = n
36f70 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61  Header + nPayloa
36f80 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  d;.    testcase(
36f90 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73   n==3 );.    tes
36fa0 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20  tcase( n==4 );. 
36fb0 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d     if( n<4 ) n =
36fc0 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   4;.    *pnSize 
36fd0 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
36fe0 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ft = nPayload;. 
36ff0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c     pPrior = pCel
37000 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
37010 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e  int mn = pPage->
37020 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20  minLocal;.    n 
37030 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64  = mn + (nPayload
37040 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d   - mn) % (pPage-
37050 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
37060 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
37070 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
37080 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
37090 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
370a0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
370b0 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61  .    if( n > pPa
370c0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e  ge->maxLocal ) n
370d0 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65   = mn;.    space
370e0 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70  Left = n;.    *p
370f0 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61  nSize = n + nHea
37100 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72  der + 4;.    pPr
37110 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  ior = &pCell[nHe
37120 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70  ader+n];.  }.  p
37130 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
37140 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a  [nHeader];..  /*
37150 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76   At this point v
37160 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20  ariables should 
37170 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77  be set as follow
37180 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e  s:.  **.  **   n
37190 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
371a0 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20    Total payload 
371b0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20  size in bytes.  
371c0 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20  **   pPayload   
371d0 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72          Begin wr
371e0 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65  iting payload he
371f0 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c  re.  **   spaceL
37200 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61  eft          Spa
37210 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  ce available at 
37220 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50  pPayload.  If nP
37230 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74  ayload>spaceLeft
37240 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ,.  **          
37250 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
37260 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d   means content m
37270 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f  ust spill into o
37280 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
37290 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20   **   *pnSize   
372a0 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66           Size of
372b0 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20   the local cell 
372c0 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76  (not counting ov
372d0 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20  erflow pages).  
372e0 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20  **   pPrior     
372f0 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f          Where to
37300 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20   write the pgno 
37310 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
37320 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a  rflow page.  **.
37330 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20    ** Use a call 
37340 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
37350 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79  lPtr() to verify
37360 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
37370 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65   above.  ** were
37380 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63   computed correc
37390 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  tly..  */.#ifdef
373a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
373b0 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
373c0 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  nfo;.    pPage->
373d0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
373e0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
373f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65  .    assert( nHe
37400 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f  ader==(int)(info
37410 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
37420 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
37430 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d  ( info.nKey==pX-
37440 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73  >nKey );.    ass
37450 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20  ert( *pnSize == 
37460 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20  info.nSize );.  
37470 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c    assert( spaceL
37480 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  eft == info.nLoc
37490 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  al );.  }.#endif
374a0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
374b0 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68   payload into th
374c0 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64  e local Cell and
374d0 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20   any extra into 
374e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a  overflow pages *
374f0 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  /.  while( nPayl
37500 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
37510 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
37520 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37530 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
37540 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
37550 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
37560 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
37570 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
37580 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
37590 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
375a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
375b0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
375c0 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
375d0 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
375e0 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
375f0 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
37600 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
37610 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
37620 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
37630 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
37640 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
37650 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
37660 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
37670 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
37680 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
37690 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
376a0 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
376b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
376c0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
376d0 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
376e0 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
376f0 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
37700 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
37710 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
37720 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
37730 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
37740 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
37750 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
37760 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
37770 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
37780 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
37790 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
377a0 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
377b0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
377c0 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
377d0 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
377e0 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
377f0 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
37800 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
37810 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
37820 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
37830 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
37840 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
37850 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
37860 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  tialized values 
37870 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
37880 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
37890 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
378a0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
378b0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
378c0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
378d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
378e0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
378f0 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
37900 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
37910 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
37920 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
37930 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
37940 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
37950 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
37960 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37970 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
37980 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
37990 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
379a0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
379b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
379c0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
379d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
379e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
379f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
37a00 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
37a10 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
37a20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
37a30 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
37a40 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
37a50 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
37a60 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
37a70 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
37a80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
37a90 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
37aa0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
37ab0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
37ac0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
37ad0 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
37ae0 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
37af0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
37b00 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
37b10 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
37b20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
37b30 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
37b40 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
37b50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
37b60 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
37b70 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
37b80 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
37b90 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
37ba0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
37bb0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
37bc0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
37bd0 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
37be0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
37bf0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
37c00 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
37c10 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
37c20 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
37c30 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
37c40 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
37c50 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
37c60 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
37c70 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
37c80 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
37c90 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
37ca0 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
37cb0 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
37cc0 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
37cd0 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
37ce0 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
37cf0 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
37d00 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
37d10 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
37d20 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
37d30 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
37d40 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
37d50 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
37d60 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
37d70 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
37d80 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
37d90 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
37da0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
37db0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
37dc0 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
37dd0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
37de0 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
37df0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
37e00 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
37e10 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
37e20 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
37e30 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
37e40 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
37e50 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
37e60 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
37e70 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
37e80 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
37e90 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
37ea0 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ..    if( nSrc>0
37eb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
37ec0 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
37ed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
37ee0 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
37ef0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
37f00 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
37f10 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
37f20 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
37f30 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
37f40 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
37f50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
37f60 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
37f70 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
37f80 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
37f90 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
37fa0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
37fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
37fd0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
37fe0 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
37ff0 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
38000 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
38010 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
38020 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
38030 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
38040 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
38050 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
38060 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
38070 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
38080 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
38090 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
380a0 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
380b0 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
380c0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
380d0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
380e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
380f0 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
38100 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
38110 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
38120 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
38130 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
38140 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20  ){.  u32 pc;    
38150 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
38160 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
38170 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
38180 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
38190 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
381a0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
381b0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
381c0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
381d0 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
381e0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
381f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
38200 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
38210 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
38220 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
38230 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
38240 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
38250 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
38260 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
38270 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
38280 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
38290 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
382a0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
382b0 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53  _DB || sz==cellS
382c0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
382d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
382e0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
382f0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
38300 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
38310 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
38320 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
38330 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
38340 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
38350 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
38360 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
38370 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
38380 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
38390 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
383a0 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
383b0 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
383c0 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
383d0 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
383e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
383f0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
38400 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
38410 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
38420 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
38430 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
38440 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
38450 20 53 51 4c 49 54 45 5f 43 4f 52 52 55