/ Hex Artifact Content
Login

Artifact 9649c95a846deddf256525125ae257ef1ce0cf29409031df8378330a45d513a6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
5c60: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
5c70: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
5c80: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c90: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5cb0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5cd0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5d00: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5d10: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5d20: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d40: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d50: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d60: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d70: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d80: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d90: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5da0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5db0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5dc0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5dd0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5de0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5df0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5e00: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5e10: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5e20: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e30: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e60: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e70: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e80: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e90: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5ea0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f00: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5f10: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5f20: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f40: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f50: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f70: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f80: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5fb0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5fc0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fd0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5ff0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6000: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6010: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6020: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6030: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6040: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6050: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6060: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6070: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6080: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6090: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
60a0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
60b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
60c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60d0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60e0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60f0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6100: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6110: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6120: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6130: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6140: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6150: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6160: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6170: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6180: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6190: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
61a0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
61b0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
61c0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61f0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
6200: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
6210: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
6220: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6230: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6240: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6250: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6260: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6270: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6280: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6290: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
62b0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
62c0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62d0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62e0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62f0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
6300: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
6310: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
6320: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6330: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6340: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6350: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6360: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6370: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6380: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6390: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
63a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
63b0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
63c0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63d0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63e0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63f0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
6400: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
6410: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6420: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6430: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6450: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6460: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6470: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6480: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6490: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
64a0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
64b0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
64c0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64d0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64e0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
6500: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
6510: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
6520: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6530: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6540: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6560: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6580: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6590: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
65a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
65b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
65c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65d0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65e0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65f0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
6600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
6610: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
6620: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6630: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6640: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6650: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6660: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6670: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6690: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
66a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
66b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
66c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6700: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
6710: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
6720: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6730: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6740: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6750: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6760: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6770: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6780: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6790: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
67a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
67b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
67c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6800: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
6810: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
6820: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6830: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6840: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6850: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6860: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6870: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6880: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6890: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
68a0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
68b0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
68c0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68d0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6900: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6910: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
6920: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6940: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6950: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6960: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6970: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
69a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
69b0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
69c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6a00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6a10: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a40: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a50: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a60: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a70: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a90: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6aa0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ac0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6ad0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6af0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6b10: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6b20: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b30: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b40: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b60: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b70: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b80: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b90: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6ba0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6bb0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6bc0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6bd0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bf0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6c00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6c10: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c30: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c40: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c50: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c80: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c90: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6ca0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6cb0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6cd0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6ce0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cf0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6d00: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6d20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d50: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d60: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d70: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d80: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d90: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
6da0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6db0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
6dc0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6dd0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6de0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6e00: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6e10: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6e20: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6e40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6e50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6e60: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
6e70: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
6e80: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
6e90: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
6ea0: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
6eb0: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
6ec0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ef0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6f00: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6f20: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6f30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f40: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
6f50: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
6f60: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
6f70: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
6f80: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
6f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fa0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6fb0: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6fe0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ff0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
7000: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
7010: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
7020: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
7030: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
7040: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
7050: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
7060: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
7070: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
7080: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
7090: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
70a0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
70b0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
70c0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
70d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
70e0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
70f0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
7100: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
7110: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7120: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7130: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7150: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
7160: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
7170: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
7180: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
7190: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
71a0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
71b0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
71c0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
71d0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
71e0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
71f0: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
7200: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
7210: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
7220: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
7230: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
7240: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
7250: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
7260: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7270: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7280: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
7290: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
72a0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
72b0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
72c0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
72d0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
72e0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
72f0: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
7300: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
7310: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
7320: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
7330: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
7340: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
7350: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
7360: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
7370: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
7380: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7390: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
73a0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
73b0: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
73c0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
73d0: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
73e0: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
73f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7400: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
7410: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
7420: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
7430: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
7440: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
7450: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
7460: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
7470: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
7480: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
7490: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
74a0: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
74b0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
74c0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
74d0: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
74e0: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
74f0: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
7500: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
7510: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
7520: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
7530: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
7540: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
7550: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
7560: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
7570: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
7580: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
7590: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
75a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
75b0: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
75c0: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
75d0: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
75e0: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
75f0: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
7600: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7610: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
7620: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7630: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
7640: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
7650: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
7660: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
7670: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
7680: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
7690: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
76a0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
76b0: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
76c0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
76d0: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
76e0: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
76f0: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
7700: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
7710: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
7720: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7730: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
7740: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
7750: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
7760: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
7770: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7780: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
7790: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
77a0: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
77b0: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
77c0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
77d0: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
77e0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
77f0: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
7800: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
7810: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
7820: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
7830: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
7840: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
7850: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
7860: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
7870: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
7880: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
7890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
78a0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
78b0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
78c0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
78d0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
78e0: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
78f0: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
7900: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
7910: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
7920: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
7930: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
7940: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
7950: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
7960: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
7970: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
7980: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
7990: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
79a0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
79b0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
79c0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
79d0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
79e0: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
79f0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7a00: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7a10: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7a20: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7a30: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7a40: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
7a50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7a60: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
7a70: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
7a80: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
7a90: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
7aa0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7ab0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7ac0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7ad0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7ae0: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7af0: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7b00: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7b10: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7b20: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7b30: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7b40: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7b50: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
7b60: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7b70: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
7b80: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7b90: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
7ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7bb0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7bc0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7bd0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7be0: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7bf0: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
7c00: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7c20: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7c30: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7c40: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7c50: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c60: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c70: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c80: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c90: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7ca0: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7cb0: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7cc0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7cd0: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7ce0: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7cf0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7d00: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7d10: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7d20: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7d30: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7d40: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7d50: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d60: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d70: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d80: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d90: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7da0: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7db0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7dc0: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7dd0: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7de0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7df0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7e00: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7e10: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7e20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7e30: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7e40: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7e50: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e60: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e70: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e90: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7ea0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7eb0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7ec0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7ed0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7ee0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7ef0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7f00: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7f10: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7f20: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7f30: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7f40: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7f50: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f60: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f70: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f80: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f90: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7fa0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7fb0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7fc0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7fd0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7fe0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7ff0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
8000: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
8010: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
8020: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
8030: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
8040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8050: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8060: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8070: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8080: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8090: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
80a0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
80b0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
80c0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
80d0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
80e0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
80f0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
8100: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
8110: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8120: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
8130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
8140: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
8150: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8160: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8180: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
81a0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
81b0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
81c0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
81d0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
81e0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
81f0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
8200: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
8210: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
8220: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
8230: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8240: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
8250: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8260: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8270: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8280: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8290: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
82a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
82b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
82c0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
82d0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
82e0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
82f0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8300: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8310: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
8320: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
8330: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8340: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
8350: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8360: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8370: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8380: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8390: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
83a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
83b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
83c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
83d0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
83e0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
83f0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8400: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
8410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8430: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
8440: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
8450: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8460: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8480: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8490: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
84a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
84b0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
84c0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
84d0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
84e0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
84f0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
8500: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
8510: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
8520: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8530: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8540: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8550: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8560: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8570: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8590: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
85a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
85b0: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
85c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
85d0: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
85e0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
85f0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
8600: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
8610: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
8620: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
8630: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
8640: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
8650: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8660: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8670: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8680: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8690: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
86a0: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
86b0: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
86c0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
86d0: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
86e0: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
86f0: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
8700: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
8710: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8720: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
8730: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8740: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8750: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8760: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8770: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8780: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8790: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
87a0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
87b0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
87c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
87d0: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
87e0: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
87f0: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
8800: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
8810: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
8820: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
8830: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
8840: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
8850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8860: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8870: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8880: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8890: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
88a0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
88b0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
88c0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
88d0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
88e0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
88f0: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
8900: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8910: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8920: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
8930: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8940: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
8950: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8960: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8970: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8980: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8990: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
89a0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
89b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
89c0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
89d0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
89e0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
89f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
8a00: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
8a10: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
8a20: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
8a30: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
8a40: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
8a50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a60: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a70: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a80: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a90: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8aa0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8ab0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8ac0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8ad0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8af0: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8b00: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8b10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8b20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8b30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8b40: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8b50: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b60: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b70: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b80: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b90: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8bc0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8bd0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8be0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8bf0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8c00: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8c10: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8c20: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8c30: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8c40: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c80: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c90: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8ca0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8cb0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8cc0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8cd0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8ce0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8cf0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8d00: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8d10: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8d20: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8d30: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8d40: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8d50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d60: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d80: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d90: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8da0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8db0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8dc0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8dd0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8de0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8df0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8e00: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8e10: 74 72 28 78 2c 20 79 2c 20 7a 2c 20 72 63 29 0a  tr(x, y, z, rc).
8e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8e30: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8e40: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8e50: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8e60: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8e70: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8e80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8e90: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8ea0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8eb0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8ec0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8ed0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8ee0: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8ef0: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8f00: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8f10: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8f20: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8f30: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8f40: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8f50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8f60: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8f70: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8f80: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8f90: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8fa0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8fb0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8fc0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8fd0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8fe0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8ff0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
9000: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
9010: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
9020: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
9030: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
9040: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
9050: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
9060: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
9070: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
9080: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
9090: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
90a0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
90b0: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
90c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
90d0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
90e0: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
90f0: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
9100: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
9110: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
9120: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
9130: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
9140: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
9150: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
9160: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
9170: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9180: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9190: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
91a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
91b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
91c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
91d0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9200: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9210: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9230: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9240: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
9250: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9260: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
9270: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
9280: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
9290: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
92a0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
92b0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
92c0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
92d0: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
92e0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
92f0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
9300: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
9310: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
9320: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
9330: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
9340: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
9350: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9360: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9370: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9380: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9390: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
93a0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
93b0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
93c0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
93d0: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
93e0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
93f0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9400: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
9410: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
9420: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
9430: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
9440: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
9450: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9460: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9470: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9480: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9490: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
94a0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
94b0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
94c0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
94d0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
94e0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
94f0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
9500: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
9510: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
9520: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
9530: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9540: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9550: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9560: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9570: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9580: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9590: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
95a0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
95b0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
95c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
95d0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
95e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
95f0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9600: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
9610: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
9620: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
9630: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
9640: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
9650: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9660: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9670: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9680: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9690: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
96a0: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
96b0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
96c0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
96d0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
96e0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
96f0: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
9700: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
9710: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
9720: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
9730: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9740: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
9750: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9760: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9770: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9780: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9790: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
97a0: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
97b0: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
97c0: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
97d0: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
97e0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
97f0: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
9800: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
9810: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
9820: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
9830: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
9840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
9850: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9860: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9870: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9880: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9890: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
98a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98d0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98e0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9900: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9910: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
9920: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9930: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9940: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9950: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9960: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9970: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9980: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9990: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
99a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
99b0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
99c0: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
99d0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
99e0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
99f0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9a00: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9a10: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
9a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
9a30: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9a40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
9a50: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9a60: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9a70: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9aa0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9ab0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9ac0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9ad0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9ae0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9af0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9b00: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9b10: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9b20: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9b30: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9b40: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9b50: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9b60: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9b70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9b80: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9b90: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9ba0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9bb0: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9bc0: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9bd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9be0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9bf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9c00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9c10: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9c20: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9c30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9c40: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9c50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9c60: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9c70: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9c80: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9c90: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9ca0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9cb0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9cc0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9cd0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9ce0: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9cf0: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9d00: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9d10: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9d20: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9d30: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9d40: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9d50: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9d60: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9d70: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9d80: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9d90: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9da0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9db0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9dc0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9dd0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9de0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9df0: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9e00: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9e10: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9e20: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9e30: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9e40: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9e50: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9e60: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9e70: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9e80: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9e90: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9ea0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9eb0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9ec0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ed0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9ee0: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9ef0: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9f00: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9f10: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9f20: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9f30: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9f40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9f50: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9f70: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9f80: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9f90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9fb0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9fc0: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9fd0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9fe0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9ff0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a000: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a010: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a020: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a030: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a040: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a050: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a060: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a070: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a080: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a090: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a0a0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a0b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a0c0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a0d0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a0e0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a0f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a100: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a110: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a120: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a130: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a140: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a150: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a160: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a170: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a180: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a190: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a1a0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a1b0: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a1c0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a1d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a1e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
a1f0: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
a200: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a210: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a220: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a230: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
a240: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a250: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
a260: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
a270: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a280: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a290: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a2a0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2c0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
a2d0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
a2e0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a300: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
a310: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a340: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a360: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a370: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a380: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a390: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a3a0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a3b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a3c0: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a3d0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a3e0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a3f0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a400: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a410: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a420: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a430: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a440: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a450: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a460: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a470: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a480: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a490: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a4a0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a4b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a4c0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a4d0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a4e0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a4f0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a500: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a510: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a520: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a530: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a540: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a550: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a560: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a570: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a580: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a590: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a5a0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a5b0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a5c0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a5d0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a5e0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a5f0: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a600: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a610: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a620: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a630: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a640: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a650: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a660: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a670: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a680: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a690: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a6a0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a6b0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a6c0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a6d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a6e0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a6f0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a700: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a710: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a720: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a730: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a740: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a750: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a760: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a770: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a780: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a790: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a7a0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a7b0: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a7d0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a7e0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a7f0: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a800: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a810: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a820: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a830: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a840: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a850: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a860: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a870: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a880: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a890: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a8a0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a8b0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a8c0: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a8d0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a8e0: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a8f0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a900: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a910: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a920: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a930: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a940: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a950: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a960: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a970: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a980: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a990: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a9a0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a9b0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a9c0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a9d0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a9e0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a9f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
aa00: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
aa10: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa40: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
aa50: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
aa60: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
aa90: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
aaa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aab0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
aac0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
aad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
aae0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
aaf0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
ab00: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
ab10: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
ab20: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
ab30: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
ab40: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
ab50: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
ab60: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
ab70: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
ab80: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
ab90: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
aba0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
abb0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
abc0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
abd0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
abe0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
abf0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
ac00: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
ac10: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
ac20: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
ac30: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
ac40: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
ac50: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
ac60: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
ac70: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
ac80: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
ac90: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
aca0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
acb0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
acc0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
acd0: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
ace0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
acf0: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
ad00: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
ad10: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
ad20: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
ad30: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
ad40: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
ad50: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
ad60: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ad70: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
ad80: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
ad90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
ada0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
adb0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
adc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
add0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
ade0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
adf0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
ae00: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
ae10: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
ae20: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ae30: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
ae40: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ae60: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ae70: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ae80: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ae90: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
aea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
aeb0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
aec0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
aed0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
aee0: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
aef0: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
af00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
af10: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
af20: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
af30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
af40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af50: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af60: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
af70: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
af80: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
af90: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
afa0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
afb0: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
afc0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
afd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
afe0: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
aff0: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
b000: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
b010: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
b020: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b030: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
b040: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
b050: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b060: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
b070: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b080: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b090: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b0b0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b0c0: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
b0d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b0e0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
b0f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b100: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b110: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
b120: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
b130: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
b140: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
b150: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
b160: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
b170: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
b180: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
b190: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
b1a0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
b1b0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
b1c0: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
b1d0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
b1e0: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
b1f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
b200: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
b210: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b220: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
b230: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
b240: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b250: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
b260: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b270: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
b280: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
b290: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
b2a0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
b2b0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b2c0: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
b2d0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
b2e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
b2f0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
b300: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
b310: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b320: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
b330: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
b340: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
b350: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b360: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b370: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b380: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b390: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b3a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b3b0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b3c0: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b3d0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b3e0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b3f0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b410: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ./*.** The cell 
b430: 70 43 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74  pCell is current
b440: 6c 79 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  ly part of page 
b450: 70 53 72 63 20 62 75 74 20 77 69 6c 6c 20 75 6c  pSrc but will ul
b460: 74 69 6d 61 74 65 6c 79 20 62 65 20 70 61 72 74  timately be part
b470: 0a 2a 2a 20 6f 66 20 70 50 61 67 65 2e 20 20 28  .** of pPage.  (
b480: 70 53 72 63 20 61 6e 64 20 70 50 61 67 65 72 20  pSrc and pPager 
b490: 61 72 65 20 6f 66 74 65 6e 20 74 68 65 20 73 61  are often the sa
b4a0: 6d 65 2e 29 20 20 49 66 20 70 43 65 6c 6c 20 63  me.)  If pCell c
b4b0: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 70 6f 69  ontains a.** poi
b4c0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
b4d0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
b4e0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
b4f0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
b500: 6f 72 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  or.** the overfl
b510: 6f 77 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ow page that wil
b520: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72  l be valid after
b530: 20 70 43 65 6c 6c 20 68 61 73 20 62 65 65 6e 20   pCell has been 
b540: 6d 6f 76 65 64 20 74 6f 20 70 50 61 67 65 2e 0a  moved to pPage..
b550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b560: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
b570: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b580: 4d 65 6d 50 61 67 65 20 2a 70 53 72 63 2c 20 75  MemPage *pSrc, u
b590: 38 20 2a 70 43 65 6c 6c 2c 69 6e 74 20 2a 70 52  8 *pCell,int *pR
b5a0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
b5b0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
b5c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b5d0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
b5e0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b5f0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b600: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
b610: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
b620: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
b630: 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20 20 20   Pgno ovfl;.    
b640: 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
b650: 4e 28 70 53 72 63 2d 3e 61 44 61 74 61 45 6e 64  N(pSrc->aDataEnd
b660: 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69  , pCell, pCell+i
b670: 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
b680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b690: 53 72 63 21 3d 70 50 61 67 65 20 29 3b 0a 20 20  Src!=pPage );.  
b6a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
b6b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b6c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b6d0: 20 20 7d 0a 20 20 20 20 6f 76 66 6c 20 3d 20 67    }.    ovfl = g
b6e0: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
b6f0: 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20  nfo.nSize-4]);. 
b700: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
b710: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
b720: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
b730: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
b740: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
b750: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
b760: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
b770: 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  en. This routine
b780: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c   reorganizes cel
b790: 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ls within the.**
b7a0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
b7b0: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d  ere are no free-
b7c0: 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72  blocks on the fr
b7d0: 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a  ee-block list..*
b7e0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
b7f0: 4d 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d  MaxFrag is the m
b800: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
b810: 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63   fragmented spac
b820: 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
b830: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b840: 70 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20  page after this 
b850: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
b860: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
b870: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
b880: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
b890: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
b8a0: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
b8b0: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
b8c0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b8d0: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
b8e0: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
b8f0: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
b900: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
b910: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
b920: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
b930: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
b940: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
b950: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
b960: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
b970: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
b980: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
b990: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d  e *pPage, int nM
b9a0: 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69  axFrag){.  int i
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b9c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b9d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
b9e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b9f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
ba00: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
ba10: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
ba40: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
ba50: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba70: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
ba80: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
ba90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
baa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
bab0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
bac0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
bad0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
bae0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
baf0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bb00: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
bb10: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
bb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bb30: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
bb40: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
bb50: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bb70: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
bb80: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bb90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bba0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
bbb0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
bbc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bbd0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
bbe0: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
bbf0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
bc00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
bc10: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
bc20: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
bc30: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
bc40: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
bc50: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bc60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
bc70: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc90: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bca0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61  ll index */..  a
bcb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bcc0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bcd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bcf0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
bd00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
bd10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
bd20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
bd30: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
bd40: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
bd50: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
bd60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bd70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bd80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
bd90: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
bda0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bdb0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
bdc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bdd0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
bde0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bdf0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
be00: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
be10: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
be20: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
be30: 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ) );.  iCellFirs
be40: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
be50: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62   2*nCell;.  usab
be60: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
be70: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
be80: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63  ..  /* This bloc
be90: 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20  k handles pages 
bea0: 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65  with two or fewe
beb0: 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e  r free blocks an
bec0: 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20  d nMaxFrag.  ** 
bed0: 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e  or fewer fragmen
bee0: 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68  ted bytes. In th
bef0: 69 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61  is case it is fa
bf00: 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65  ster to move the
bf10: 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e  .  ** two (or on
bf20: 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c  e) blocks of cel
bf30: 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65  ls using memmove
bf40: 28 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  () and add the r
bf50: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66  equired.  ** off
bf60: 73 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69  sets to each poi
bf70: 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c  nter in the cell
bf80: 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74  -pointer array t
bf90: 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20  han it is to .  
bfa0: 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74  ** reconstruct t
bfb0: 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20  he entire page. 
bfc0: 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64   */.  if( (int)d
bfd0: 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78  ata[hdr+7]<=nMax
bfe0: 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  Frag ){.    int 
bff0: 69 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65  iFree = get2byte
c000: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c010: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
c020: 6e 69 74 69 61 6c 20 66 72 65 65 62 6c 6f 63 6b  nitial freeblock
c030: 20 6f 66 66 73 65 74 20 77 65 72 65 20 6f 75 74   offset were out
c040: 20 6f 66 20 62 6f 75 6e 64 73 2c 20 74 68 61 74   of bounds, that
c050: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 68 61   would.    ** ha
c060: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ve been detected
c070: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
c080: 65 28 29 20 77 68 65 6e 20 69 74 20 77 61 73 20  e() when it was 
c090: 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 0a 20 20  computing the.  
c0a0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66    ** number of f
c0b0: 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ree bytes on the
c0c0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
c0d0: 73 65 72 74 28 20 69 46 72 65 65 3c 3d 75 73 61  sert( iFree<=usa
c0e0: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
c0f0: 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20   if( iFree ){.  
c100: 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d      int iFree2 =
c110: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c120: 69 46 72 65 65 5d 29 3b 0a 20 20 20 20 20 20 69  iFree]);.      i
c130: 66 28 20 69 46 72 65 65 32 3e 75 73 61 62 6c 65  f( iFree2>usable
c140: 53 69 7a 65 2d 34 20 29 20 72 65 74 75 72 6e 20  Size-4 ) return 
c150: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c160: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
c170: 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20    if( 0==iFree2 
c180: 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d  || (data[iFree2]
c190: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72 65  ==0 && data[iFre
c1a0: 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20  e2+1]==0) ){.   
c1b0: 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20       u8 *pEnd = 
c1c0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c1d0: 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20   + nCell*2];.   
c1e0: 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a       u8 *pAddr;.
c1f0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20          int sz2 
c200: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
c210: 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
c220: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a  data[iFree+2]);.
c230: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20          int top 
c240: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c250: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
c260: 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65    if( top>=iFree
c270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
c280: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c290: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
c2a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c2b0: 20 20 20 69 66 28 20 69 46 72 65 65 32 20 29 7b     if( iFree2 ){
c2c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
c2d0: 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32 20 29  Free+sz>iFree2 )
c2e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c2f0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
c300: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  e);.          sz
c310: 32 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  2 = get2byte(&da
c320: 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20  ta[iFree2+2]);. 
c330: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
c340: 65 65 32 2b 73 7a 32 20 3e 20 75 73 61 62 6c 65  ee2+sz2 > usable
c350: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
c360: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c370: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c380: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
c390: 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c  a[iFree+sz+sz2],
c3a0: 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d   &data[iFree+sz]
c3b0: 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  , iFree2-(iFree+
c3c0: 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sz));.          
c3d0: 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20  sz += sz2;.     
c3e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72     }.        cbr
c3f0: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
c400: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c410: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
c420: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c430: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
c440: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
c450: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
c460: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
c470: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
c480: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
c490: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
c4a0: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
c4b0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
c4c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
c4d0: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
c4e0: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
c4f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
c500: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
c510: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
c520: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
c530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c540: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
c550: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
c560: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
c570: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
c580: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c590: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
c5a0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
c5b0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
c5c0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
c5d0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
c5e0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
c5f0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c600: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
c610: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
c620: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c630: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
c640: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c650: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
c660: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
c670: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
c680: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
c690: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
c6a0: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
c6b0: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
c6c0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
c6d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
c6e0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c6f0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c700: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c710: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c720: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
c730: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
c740: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
c750: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
c760: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
c770: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
c780: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
c790: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
c7a0: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
c7b0: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
c7c0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c7d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c7e0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c7f0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
c800: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
c810: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
c820: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
c830: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c840: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
c850: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
c860: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
c870: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c880: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
c890: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
c8a0: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
c8b0: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
c8c0: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
c8d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c8e0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
c8f0: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
c900: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
c910: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
c920: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c930: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
c940: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
c950: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
c960: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
c970: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
c980: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
c990: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
c9a0: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61   size);.  }.  da
c9b0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a  ta[hdr+7] = 0;..
c9c0: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a   defragment_out:
c9d0: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
c9e0: 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  7]+cbrk-iCellFir
c9f0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
ca00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ca10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
ca20: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
ca30: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69   assert( cbrk>=i
ca40: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70  CellFirst );.  p
ca50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
ca60: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
ca70: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
ca80: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
ca90: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
caa0: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
cab0: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
cac0: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
cad0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
cae0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
caf0: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
cb00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cb10: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
cb20: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
cb30: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
cb40: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
cb50: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
cb60: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
cb70: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
cb80: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
cb90: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
cba0: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
cbb0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
cbc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
cbd0: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
cbe0: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
cbf0: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
cc00: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
cc10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
cc20: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
cc30: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
cc40: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
cc50: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
cc60: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
cc70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
cc80: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
cc90: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
cca0: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
ccb0: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
ccc0: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
ccd0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
cce0: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
ccf0: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
cd00: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
cd10: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
cd20: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
cd30: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
cd40: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
cd50: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
cd60: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
cd70: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
cd80: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
cd90: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
cda0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
cdb0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
cdc0: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
cdd0: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
cde0: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
cdf0: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
ce00: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
ce10: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
ce20: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
ce30: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
ce40: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20  ableSize;.  int 
ce50: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
ce60: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
ce70: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20  free slot */..  
ce80: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
ce90: 20 20 77 68 69 6c 65 28 20 70 63 3c 3d 75 73 61    while( pc<=usa
cea0: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
ceb0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
cec0: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
ced0: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
cee0: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
cef0: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
cf00: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
cf10: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
cf20: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
cf30: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
cf40: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
cf50: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
cf60: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
cf70: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
cf80: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
cf90: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
cfa0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
cfb0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
cfc0: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
cfd0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
cfe0: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  3 );.      if( s
cff0: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
d000: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ize ){.        *
d010: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
d020: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
d030: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
d040: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d050: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
d060: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d070: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
d080: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
d090: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
d0a0: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
d0b0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
d0c0: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
d0d0: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
d0e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
d0f0: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
d100: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
d110: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
d120: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
d130: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
d140: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
d150: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
d160: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
d170: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
d180: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
d190: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
d1a0: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
d1b0: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
d1c0: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
d1d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d1e0: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
d1f0: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
d200: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
d210: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
d220: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
d230: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
d240: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
d250: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
d260: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
d270: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
d280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d290: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
d2a0: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
d2b0: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
d2c0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
d2d0: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  &aData[pc]);.   
d2e0: 20 69 66 28 20 70 63 3c 69 41 64 64 72 2b 73 69   if( pc<iAddr+si
d2f0: 7a 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ze ) break;.  }.
d300: 20 20 69 66 28 20 70 63 20 29 7b 0a 20 20 20 20    if( pc ){.    
d310: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
d320: 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b  RRUPT_PAGE(pPg);
d330: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
d340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
d350: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
d360: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
d370: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
d380: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
d390: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
d3a0: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
d3b0: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
d3c0: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
d3d0: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
d3e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
d3f0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
d400: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
d410: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
d420: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
d430: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
d440: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
d450: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
d460: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
d470: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
d480: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
d490: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
d4a0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
d4b0: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
d4c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
d4d0: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
d4e0: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
d4f0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
d500: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
d510: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
d520: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
d530: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
d540: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
d550: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
d560: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
d570: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
d580: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
d590: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
d5a0: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
d5b0: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
d5c0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
d5d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
d5e0: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
d5f0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
d600: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
d610: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
d620: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d630: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
d640: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d650: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
d660: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
d670: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d680: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
d690: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
d6a0: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
d6b0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6d0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
d6e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d6f0: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
d700: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d720: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
d730: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
d740: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d750: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
d760: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
d770: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
d780: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
d790: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d7a0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
d7b0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
d7c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d7d0: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
d7e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d7f0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d800: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
d810: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
d820: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
d830: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
d840: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
d850: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
d860: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d870: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
d880: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
d890: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
d8a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
d8b0: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
d8c0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
d8d0: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
d8e0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
d8f0: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
d900: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
d910: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
d920: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
d930: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
d940: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
d950: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
d960: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
d970: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
d980: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
d990: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
d9a0: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
d9b0: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
d9c0: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
d9d0: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
d9e0: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
d9f0: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
da00: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
da10: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
da20: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
da30: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
da40: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
da50: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
da60: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
da70: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
da80: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
da90: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
daa0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
dab0: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
dac0: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
dad0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
dae0: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
daf0: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
db00: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
db10: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
db20: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
db30: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
db40: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
db50: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
db60: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
db70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
db80: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
db90: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
dba0: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
dbb0: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
dbc0: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
dbd0: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
dbe0: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
dbf0: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
dc00: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
dc10: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
dc20: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
dc30: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
dc40: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
dc50: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
dc60: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
dc70: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
dc80: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
dc90: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
dca0: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
dcb0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
dcc0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
dcd0: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
dce0: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
dcf0: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
dd00: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
dd10: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
dd20: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
dd30: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
dd40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
dd50: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
dd60: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
dd70: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
dd80: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
dd90: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
dda0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ddb0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
ddc0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
ddd0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
dde0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
ddf0: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
de00: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
de10: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
de20: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
de30: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
de40: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
de50: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
de60: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
de70: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
de80: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
de90: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dea0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
deb0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
dec0: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
ded0: 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d  entPage(pPage, M
dee0: 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72  IN(4, pPage->nFr
def0: 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29  ee - (2+nByte)))
df00: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
df10: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
df20: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
df30: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
df40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
df50: 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20  ap+2+nByte<=top 
df60: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
df70: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
df80: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
df90: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
dfa0: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
dfb0: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
dfc0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
dfd0: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
dfe0: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
dff0: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
e000: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
e010: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
e020: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
e030: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
e040: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
e050: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
e060: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
e070: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
e080: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
e090: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
e0a0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
e0b0: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
e0c0: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
e0d0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
e0e0: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
e0f0: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
e100: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
e110: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
e120: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
e130: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e140: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
e150: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
e160: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
e170: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
e180: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
e190: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
e1a0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
e1b0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
e1c0: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
e1d0: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
e1e0: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
e1f0: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
e200: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
e210: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
e220: 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74  Note that even t
e230: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
e240: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
e250: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
e260: 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74  tPage(),.** that
e270: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
e280: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
e290: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f   between cells o
e2a0: 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  r freeblocks.  N
e2b0: 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65  or.** does it de
e2c0: 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72  tect cells or fr
e2d0: 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e  eeblocks that en
e2e0: 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20  crouch into the 
e2f0: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a  reserved bytes.*
e300: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
e310: 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f  the page.  So do
e320: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72   additional corr
e330: 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e  uption checks in
e340: 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75  side this.** rou
e350: 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tine and return 
e360: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
e370: 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61  f any problems a
e380: 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  re found..*/.sta
e390: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
e3a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
e3b0: 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31  , u16 iStart, u1
e3c0: 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20  6 iSize){.  u16 
e3d0: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e400: 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65  ptr to next free
e410: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69  block */.  u16 i
e420: 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20  FreeBlk;        
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
e450: 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  he next freebloc
e460: 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20  k */.  u8 hdr;  
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e490: 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65  Page header size
e4a0: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
e4b0: 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20   u8 nFrag = 0;  
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74         /* Reduct
e4e0: 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61  ion in fragmenta
e4f0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f  tion */.  u16 iO
e500: 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b  rigSize = iSize;
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
e530: 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20  e of iSize */.  
e540: 75 31 36 20 78 3b 20 20 20 20 20 20 20 20 20 20  u16 x;          
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
e570: 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
e580: 61 72 65 61 20 2a 2f 0a 20 20 75 33 32 20 69 45  area */.  u32 iE
e590: 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53  nd = iStart + iS
e5a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
e5b0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
e5c0: 73 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75  st the iStart bu
e5d0: 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ffer */.  unsign
e5e0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
e5f0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
e600: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20  /* Page content 
e610: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
e620: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
e630: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e640: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
e650: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e660: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
e670: 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61  RRUPT_DB || iSta
e680: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
e690: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
e6a0: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
e6b0: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
e6c0: 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50  DB || iEnd <= pP
e6d0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e6e0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
e6f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e700: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e710: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
e720: 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b  ert( iSize>=4 );
e730: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
e740: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
e750: 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
e760: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
e770: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20  ableSize-4 );.. 
e780: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20   /* The list of 
e790: 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20  freeblocks must 
e7a0: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
e7b0: 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65  order.  Find the
e7c0: 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74   .  ** spot on t
e7d0: 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53  he list where iS
e7e0: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69  tart should be i
e7f0: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
e800: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
e810: 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d  Offset;.  iPtr =
e820: 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20   hdr + 1;.  if( 
e830: 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20  data[iPtr+1]==0 
e840: 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30  && data[iPtr]==0
e850: 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b   ){.    iFreeBlk
e860: 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63   = 0;  /* Shortc
e870: 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ut for the case 
e880: 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73  when the freelis
e890: 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  t is empty */.  
e8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
e8b0: 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65  ( (iFreeBlk = ge
e8c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
e8d0: 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20  r]))<iStart ){. 
e8e0: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
e8f0: 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20  k<iPtr+4 ){.    
e900: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e910: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e920: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e930: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e940: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
e950: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
e960: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
e970: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 70 50   if( iFreeBlk>pP
e980: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e990: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
e9a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e9b0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
e9c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
e9d0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
e9e0: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
e9f0: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
ea00: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
ea10: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
ea20: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
ea30: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
ea40: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
ea50: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
ea60: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
ea70: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
ea80: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
ea90: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
eaa0: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
eab0: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
eac0: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
ead0: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
eae0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
eaf0: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
eb00: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
eb10: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
eb20: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
eb30: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
eb40: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
eb50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
eb60: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
eb70: 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b   iEnd = iFreeBlk
eb80: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
eb90: 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a  a[iFreeBlk+2]);.
eba0: 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e        if( iEnd >
ebb0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
ebc0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
ebd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ebe0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ebf0: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
ec00: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
ec10: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   - iStart;.     
ec20: 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32   iFreeBlk = get2
ec30: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
ec40: 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Blk]);.    }.  .
ec50: 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69      /* If iPtr i
ec60: 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c  s another freebl
ec70: 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66  ock (that is, if
ec80: 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65   iPtr is not the
ec90: 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a   freelist.    **
eca0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
ecb0: 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65  page header) the
ecc0: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
ecd0: 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  f iStart should 
ece0: 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73  be.    ** coales
ecf0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
ed00: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
ed10: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
ed20: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
ed30: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
ed40: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
ed50: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
ed60: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
ed70: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
ed80: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
ed90: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
eda0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
edb0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
edc0: 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72    nFrag += iStar
edd0: 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20  t - iPtrEnd;.   
ede0: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
edf0: 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  d - iPtr;.      
ee00: 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b    iStart = iPtr;
ee10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ee20: 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74     if( nFrag>dat
ee30: 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72  a[hdr+7] ) retur
ee40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ee50: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ee60: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
ee70: 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20   nFrag;.  }.  x 
ee80: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ee90: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20  [hdr+5]);.  if( 
eea0: 69 53 74 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20  iStart<=x ){.   
eeb0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65   /* The new free
eec0: 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20  block is at the 
eed0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
eee0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
eef0: 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75  ea,.    ** so ju
ef00: 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65  st extend the ce
ef10: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
ef20: 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61  rather than crea
ef30: 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a  te another.    *
ef40: 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79  * freelist entry
ef50: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 53 74 61   */.    if( iSta
ef60: 72 74 3c 78 20 7c 7c 20 69 50 74 72 21 3d 68 64  rt<x || iPtr!=hd
ef70: 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+1 ) return SQL
ef80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
ef90: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70 75 74  (pPage);.    put
efa0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
efb0: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
efc0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
efd0: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
efe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
eff0: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
f000: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
f010: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
f020: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
f030: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
f040: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
f050: 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  e->pBt->btsFlags
f060: 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
f070: 52 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  RE ){.    /* Ove
f080: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
f090: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
f0a0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
f0b0: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20  ecure_delete.   
f0c0: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
f0d0: 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  abled */.    mem
f0e0: 73 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74  set(&data[iStart
f0f0: 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20  ], 0, iSize);.  
f100: 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
f110: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
f120: 65 42 6c 6b 29 3b 0a 20 20 70 75 74 32 62 79 74  eBlk);.  put2byt
f130: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32  e(&data[iStart+2
f140: 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 70 50 61  ], iSize);.  pPa
f150: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72  ge->nFree += iOr
f160: 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  igSize;.  return
f170: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f180: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
f190: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
f1a0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
f1b0: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
f1c0: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
f1d0: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
f1e0: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
f1f0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
f200: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
f210: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
f220: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
f230: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
f240: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
f250: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
f260: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
f270: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
f280: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
f290: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
f2a0: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
f2b0: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
f2c0: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
f2d0: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
f2e0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
f2f0: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
f300: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
f310: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
f320: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
f330: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
f340: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
f350: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
f360: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
f370: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f380: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
f390: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
f3a0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
f3b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f3c0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
f3d0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f3e0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
f3f0: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
f400: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
f410: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
f420: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
f430: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
f440: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
f450: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
f460: 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
f470: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
f480: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
f490: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
f4a0: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
f4b0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f4c0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) ){.    /* EVID
f4d0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31  ENCE-OF: R-07291
f4e0: 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f  -35328 A value o
f4f0: 66 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73  f 5 (0x05) means
f500: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a   the page is an.
f510: 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20      ** interior 
f520: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67  table b-tree pag
f530: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f540: 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  ( (PTF_LEAFDATA|
f550: 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29  PTF_INTKEY)==5 )
f560: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f570: 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39  E-OF: R-26900-09
f580: 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31  176 A value of 1
f590: 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74  3 (0x0d) means t
f5a0: 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20  he page is a.   
f5b0: 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62   ** leaf table b
f5c0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f5d0: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f5e0: 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
f5f0: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  KEY|PTF_LEAF)==1
f600: 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  3 );.    pPage->
f610: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
f620: 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
f630: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  ){.      pPage->
f640: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a  intKeyLeaf = 1;.
f650: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
f660: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
f670: 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20  arseCellPtr;.   
f680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
f690: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
f6a0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
f6b0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
f6c0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
f6d0: 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  ad;.      pPage-
f6e0: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
f6f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
f700: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a  oPayload;.    }.
f710: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
f720: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
f730: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
f740: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
f750: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
f760: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
f770: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
f780: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f790: 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20  : R-43316-37308 
f7a0: 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78  A value of 2 (0x
f7b0: 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  02) means the pa
f7c0: 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  ge is an.    ** 
f7d0: 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62  interior index b
f7e0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f7f0: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f800: 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a  ZERODATA)==2 );.
f810: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f820: 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32  OF: R-59615-4282
f830: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20  8 A value of 10 
f840: 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65  (0x0a) means the
f850: 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a   page is a.    *
f860: 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74  * leaf index b-t
f870: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
f880: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45   assert( (PTF_ZE
f890: 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  RODATA|PTF_LEAF)
f8a0: 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67  ==10 );.    pPag
f8b0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
f8c0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f8d0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  Leaf = 0;.    pP
f8e0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
f8f0: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
f900: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
f910: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
f920: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
f930: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
f940: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
f950: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
f960: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f970: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
f980: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
f990: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
f9a0: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
f9b0: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
f9c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f9d0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
f9e0: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  age);.  }.  pPag
f9f0: 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
fa00: 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79  ad = pBt->max1by
fa10: 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  tePayload;.  ret
fa20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fa30: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
fa40: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
fa50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
fa60: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
fa70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
fa80: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
fa90: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
faa0: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
fab0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
fac0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
fad0: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
fae0: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
faf0: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
fb00: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
fb10: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
fb20: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
fb30: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
fb40: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
fb50: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
fb60: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
fb70: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
fb80: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
fb90: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
fba0: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
fbb0: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70  *pPage){.  int p
fbc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
fbd0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
fbe0: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
fbf0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
fc00: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
fc10: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
fc20: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
fc30: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
fc40: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
fc50: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
fc60: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
fc70: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
fc80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
fc90: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
fca0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ure */.  int usa
fcb0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
fcc0: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
fcd0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
fce0: 67 65 20 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c  ge */.  u16 cell
fcf0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
fd00: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
fd10: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
fd20: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
fd30: 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
fd40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fd50: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
fd60: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
fd70: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
fd80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
fd90: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
fda0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
fdb0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
fdc0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
fdd0: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
fde0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
fdf0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
fe00: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
fe10: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
fe20: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
fe30: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
fe40: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
fe50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
fe60: 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  >pBt->db!=0 );. 
fe70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
fe80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
fe90: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
fea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
feb0: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
fec0: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
fed0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
fee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fef0: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
ff00: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
ff10: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
ff20: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
ff30: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
ff40: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
ff50: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ff60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ff70: 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20  isInit==0 );..  
ff80: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ff90: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
ffa0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
ffb0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
ffc0: 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  a;.  /* EVIDENCE
ffd0: 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
ffe0: 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
fff0: 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
10000 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a   indicating.  **
10010 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
10020 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20   type. */.  if( 
10030 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
10040 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 7b  e, data[hdr]) ){
10050 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10060 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10070 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
10080 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
10090 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
100a0 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
100b0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
100c0 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
100d0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
100e0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
100f0 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75 73 61 62  flow = 0;.  usab
10100 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
10110 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  ableSize;.  pPag
10120 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
10130 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
10140 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
10150 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70 50  ildPtrSize;.  pP
10160 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10170 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
10180 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  ];.  pPage->aCel
10190 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c  lIdx = &data[cel
101a0 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70 50 61 67  lOffset];.  pPag
101b0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
101c0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
101d0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20  dPtrSize];.  /* 
101e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
101f0 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74  8015-48175 The t
10200 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10210 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69  at offset 5 desi
10220 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20  gnates.  ** the 
10230 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
10240 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
10250 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72  A zero value for
10260 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73   this integer is
10270 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65  .  ** interprete
10280 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
10290 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
102a0 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
102b0 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  +5]);.  /* EVIDE
102c0 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d  NCE-OF: R-37002-
102d0 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79  32774 The two-by
102e0 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
102f0 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65  fset 3 gives the
10300 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
10310 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
10320 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e  e. */.  pPage->n
10330 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
10340 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
10350 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
10360 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
10370 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79  {.    /* To many
10380 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
10390 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
103a0 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
103b0 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
103c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
103d0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
103e0 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  }.  testcase( pP
103f0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
10400 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a  ELL(pBt) );.  /*
10410 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
10420 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
10430 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
10440 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
10450 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73  s only.  ** poss
10460 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
10470 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
10480 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
10490 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
104a0 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74    ** offset to t
104b0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
104c0 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20  area will equal 
104d0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69  the page size mi
104e0 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62 79 74  nus the.  ** byt
104f0 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73  es of reserved s
10500 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  pace. */.  asser
10510 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
10520 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
10530 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
10540 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d 61  DB );..  /* A ma
10550 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
10560 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
10570 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
10580 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  t the end.  ** o
10590 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73  f page when pars
105a0 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20  ing a cell.  .  
105b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
105c0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
105d0 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
105e0 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
105f0 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a 2a 20 70  l extends.  ** p
10600 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
10610 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
10620 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
10630 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
10640 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
10650 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20   it does..  */. 
10660 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
10670 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
10680 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  ge->nCell;.  iCe
10690 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
106a0 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 70  ize - 4;.  if( p
106b0 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
106c0 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
106d0 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  k ){.    int i; 
106e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
106f0 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
10700 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
10710 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  */.    int sz;  
10720 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10730 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
10740 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
10750 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
10760 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  -;.    for(i=0; 
10770 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
10780 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 63 20 3d  i++){.      pc =
10790 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
107a0 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
107b0 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 74  t+i*2]);.      t
107c0 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
107d0 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
107e0 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
107f0 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
10800 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
10810 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
10820 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ast ){.        r
10830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10840 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10860 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
10870 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
10880 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 74  ta[pc]);.      t
10890 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
108a0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
108b0 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
108c0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
108d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
108e0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
108f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
10900 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
10910 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
10920 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20 20 0a 0a  lLast++;.  }  ..
10930 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
10940 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
10950 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  e on the page.  
10960 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
10970 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68  R-23588-34450 Th
10980 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
10990 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67  er at offset 1 g
109a0 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 74  ives the.  ** st
109b0 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
109c0 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
109d0 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
109e0 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
109f0 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  no.  ** freebloc
10a00 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65  ks. */.  pc = ge
10a10 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
10a20 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20  +1]);.  nFree = 
10a30 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
10a40 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65  p;  /* Init nFre
10a50 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f  e to non-freeblo
10a60 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f  ck free space */
10a70 0a 20 20 69 66 28 20 70 63 3e 30 20 29 7b 0a 20  .  if( pc>0 ){. 
10a80 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73 69 7a     u32 next, siz
10a90 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  e;.    if( pc<iC
10aa0 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
10ab0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10ac0 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
10ad0 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
10ae0 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
10af0 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a  ere will.      *
10b00 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c  * always be at l
10b10 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65  east one cell be
10b20 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66  fore the first f
10b30 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  reeblock..      
10b40 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10b50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10b60 41 47 45 28 70 50 61 67 65 29 3b 20 0a 20 20 20  AGE(pPage); .   
10b70 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20   }.    while( 1 
10b80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e  ){.      if( pc>
10b90 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
10ba0 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63       /* Freebloc
10bb0 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  k off the end of
10bc0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
10bd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10be0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10bf0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
10c00 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
10c10 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
10c20 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
10c30 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10c40 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72 65  +2]);.      nFre
10c50 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
10c60 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
10c70 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72  <=pc+size+3 ) br
10c80 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  eak;.      pc = 
10c90 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  next;.    }.    
10ca0 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20  if( next>0 ){.  
10cb0 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b      /* Freeblock
10cc0 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e   not in ascendin
10cd0 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
10ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10cf0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10d00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
10d10 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67  ( pc+size>(unsig
10d20 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53 69  ned int)usableSi
10d30 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c  ze ){.      /* L
10d40 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 65 78  ast freeblock ex
10d50 74 65 6e 64 73 20 70 61 73 74 20 70 61 67 65 20  tends past page 
10d60 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  end */.      ret
10d70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10d80 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10d90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10da0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
10db0 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
10dc0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
10dd0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
10de0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c  .  ** of the cel
10df0 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70  l-content area p
10e00 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lus the number o
10e10 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74  f free bytes wit
10e20 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c  hin.  ** the cel
10e30 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
10e40 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
10e50 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
10e60 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20  le-size.  ** of 
10e70 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
10e80 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
10e90 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
10ea0 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20  check also.  ** 
10eb0 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79  serves to verify
10ec0 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74   that the offset
10ed0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
10ee0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10ef0 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63  t.  ** area, acc
10f00 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
10f10 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
10f20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
10f30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
10f40 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
10f50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10f60 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10f70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Page);.  }.  pPa
10f80 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10f90 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
10fa0 69 72 73 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e  irst);.  pPage->
10fb0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65  isInit = 1;.  re
10fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
10fe0 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
10ff0 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
11000 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
11010 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
11020 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
11030 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
11040 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
11050 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
11060 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
11070 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
11080 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
11090 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
110a0 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
110b0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
110c0 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
110d0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
110e0 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
110f0 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
11100 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
11110 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11120 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
11130 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
11140 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
11150 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11160 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
11170 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
11180 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
11190 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
111a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
111b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
111c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
111d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
111e0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
111f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
11200 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
11210 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
11220 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
11230 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
11240 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
11250 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
11260 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
11270 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
11280 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
11290 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
112a0 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
112b0 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
112c0 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
112d0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
112e0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
112f0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
11300 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
11310 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
11320 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
11330 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
11340 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
11350 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
11360 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
11370 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
11380 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
11390 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
113a0 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
113b0 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
113c0 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
113d0 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
113e0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
113f0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
11400 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11410 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
11420 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
11430 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
11440 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
11450 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
11460 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
11470 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
11480 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
11490 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
114a0 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
114b0 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
114c0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
114d0 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
114e0 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
114f0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
11500 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
11510 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
11520 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11530 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11540 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
11550 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11560 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
11570 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70  ( pgno!=pPage->p
11580 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
11590 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
115a0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
115b0 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67  bPage);.    pPag
115c0 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
115d0 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Page;.    pPage-
115e0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
115f0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
11600 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68  no;.    pPage->h
11610 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
11620 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
11630 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
11640 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  e->aData==sqlite
11650 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11660 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
11670 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
11680 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
11690 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
116a0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
116b0 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
116c0 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
116d0 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
116e0 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62  ed.  See also: b
116f0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
11700 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
11710 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
11720 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65  NTENT flag is se
11730 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
11740 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   we do not care.
11750 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  ** about the con
11760 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
11770 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
11780 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
11790 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
117a0 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
117b0 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
117c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
117d0 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
117e0 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
117f0 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
11800 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
11810 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
11820 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
11830 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
11840 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
11850 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
11860 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
11870 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
11880 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
11890 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
118a0 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
118b0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
118c0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
118d0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
118e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
118f0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
11900 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
11910 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
11920 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
11930 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
11940 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
11950 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
11960 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11970 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
11980 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
11990 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
119a0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
119b0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
119c0 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
119d0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c  _GET_NOCONTENT |
119e0 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
119f0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20  ET_READONLY );. 
11a00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11a10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11a20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
11a30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
11a40 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
11a50 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
11a60 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
11a70 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
11a80 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
11a90 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
11aa0 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
11ab0 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
11ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
11ae0 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
11af0 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
11b00 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
11b10 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
11b20 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
11b30 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
11b40 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
11b50 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
11b60 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
11b70 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
11b80 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
11b90 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
11ba0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
11bb0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
11bc0 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
11bd0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
11be0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11bf0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11c00 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
11c10 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
11c20 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
11c30 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
11c40 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
11c50 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
11c60 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
11c70 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
11c80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
11c90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11ca0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
11cb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
11cc0 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
11cd0 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
11ce0 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
11cf0 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
11d00 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
11d10 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
11d20 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
11d30 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
11d40 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
11d50 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
11d60 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
11d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
11d80 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
11d90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
11da0 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
11db0 30 78 38 30 30 30 30 30 30 30 29 3d 3d 30 20 29  0x80000000)==0 )
11dc0 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
11dd0 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
11de0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
11df0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
11e00 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
11e10 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  lize it..**.** I
11e20 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74  f pCur!=0 then t
11e30 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
11e40 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74   fetched as part
11e50 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   of a moveToChil
11e60 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f  d().** call.  Do
11e70 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
11e80 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
11e90 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
11ea0 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20  case..** And if 
11eb0 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c  the fetch fails,
11ec0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   this routine mu
11ed0 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75  st decrement pCu
11ee0 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  r->iPage..**.** 
11ef0 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63  The page is fetc
11f00 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74  hed as read-writ
11f10 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73  e unless pCur is
11f20 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73   not NULL and is
11f30 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  .** a read-only 
11f40 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
11f50 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11f60 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
11f70 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
11f80 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
11f90 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
11fa0 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
11fb0 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
11fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
11fd0 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
11fe0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12000 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
12010 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
12020 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
12030 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12040 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
12050 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
12060 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
12070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12080 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
12090 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42  nter here */.  B
120a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
120c0 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65  * Cursor to rece
120d0 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72  ive the page, or
120e0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62   NULL */.  int b
120f0 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20  ReadOnly        
12100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
12110 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
12120 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ly page */.){.  
12130 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
12140 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
12150 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12160 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
12170 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12180 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61   pCur==0 || ppPa
12190 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61 67 65  ge==&pCur->pPage
121a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
121b0 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
121c0 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
121d0 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
121e0 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
121f0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
12200 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
12210 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
12220 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12230 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12240 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
12250 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
12260 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
12270 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
12280 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
12290 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
122a0 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
122b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
122c0 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
122d0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
122e0 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
122f0 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
12300 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
12310 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
12320 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
12330 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
12340 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
12350 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
12360 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
12370 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
12380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
123a0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
123b0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
123c0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
123d0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
123e0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
123f0 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
12400 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
12410 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
12420 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
12430 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
12440 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
12450 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
12460 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
12470 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
12480 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
12490 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
124a0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
124b0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
124c0 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
124d0 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
124e0 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
124f0 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
12500 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
12510 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f  ORRUPT_PGNO(pgno
12520 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
12530 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
12540 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
12550 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
12560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12570 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50  OK;..getAndInitP
12580 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  age_error:.  if(
12590 20 70 43 75 72 20 29 7b 0a 20 20 20 20 70 43 75   pCur ){.    pCu
125a0 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
125b0 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
125c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
125d0 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74  >iPage];.  }.  t
125e0 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
125f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
12600 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
12610 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
12620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12630 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
12640 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
12650 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
12660 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
12670 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
12680 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a  reeGetPage..**.*
12690 2a 20 50 61 67 65 31 20 69 73 20 61 20 73 70 65  * Page1 is a spe
126a0 63 69 61 6c 20 63 61 73 65 20 61 6e 64 20 6d 75  cial case and mu
126b0 73 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75  st be released u
126c0 73 69 6e 67 20 72 65 6c 65 61 73 65 50 61 67 65  sing releasePage
126d0 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  One()..*/.static
126e0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
126f0 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
12700 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
12710 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
12720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12730 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
12740 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
12750 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
12760 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12770 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
12780 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
12790 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
127a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
127b0 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
127c0 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
127d0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
127e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
127f0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
12800 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12810 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
12820 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
12830 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61  >pDbPage);.}.sta
12840 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
12850 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
12860 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
12870 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e  e ) releasePageN
12880 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d  otNull(pPage);.}
12890 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
128a0 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50  easePageOne(MemP
128b0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
128c0 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20  ssert( pPage!=0 
128d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
128e0 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
128f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
12900 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
12910 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30  Page->pDbPage!=0
12920 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12930 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
12940 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
12950 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
12960 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
12970 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
12980 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
12990 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
129a0 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
129b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
129c0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
129d0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
129e0 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f  3PagerUnrefPageO
129f0 6e 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ne(pPage->pDbPag
12a00 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e);.}../*.** Get
12a10 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e   an unused page.
12a20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
12a30 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65  s just like btre
12a40 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20  eGetPage() with 
12a50 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a  the addition:.**
12a60 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20  .**   *  If the 
12a70 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
12a80 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20  in use for some 
12a90 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69  other purpose, i
12aa0 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
12ab0 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e     release it an
12ac0 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  d return an SQLI
12ad0 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72  TE_CURRUPT error
12ae0 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73  ..**   *  Make s
12af0 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66  ure the isInit f
12b00 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a  lag is clear.*/.
12b10 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
12b20 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20  GetUnusedPage(. 
12b30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
12b40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
12b50 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
12b60 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
12b70 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
12b80 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
12b90 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
12ba0 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
12bb0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
12bc0 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
12bd0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
12be0 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
12bf0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
12c00 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
12c10 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
12c20 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12c30 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
12c40 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
12c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12c60 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
12c70 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
12c80 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
12c90 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
12ca0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
12cb0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
12cc0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
12cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12ce0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
12cf0 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
12d00 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
12d10 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
12d20 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
12d30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
12d40 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
12d50 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
12d60 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
12d70 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
12d80 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
12d90 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
12da0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
12db0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
12dc0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
12dd0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
12de0 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
12df0 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
12e00 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12e10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12e20 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
12e30 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
12e40 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
12e50 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
12e60 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
12e70 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
12e80 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
12e90 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
12ea0 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
12eb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
12ec0 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
12ed0 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
12ee0 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
12ef0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
12f00 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12f10 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
12f20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
12f30 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
12f40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12f50 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
12f60 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12f70 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12f80 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
12f90 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12fa0 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
12fb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
12fc0 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
12fd0 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
12fe0 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
12ff0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
13000 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
13010 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
13020 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
13030 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
13040 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
13050 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
13060 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
13070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
13080 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
13090 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
130a0 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
130b0 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
130c0 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
130d0 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
130e0 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
130f0 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
13100 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
13110 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
13120 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
13130 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
13140 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
13150 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
13160 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
13170 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
13180 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
13190 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
131a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
131b0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
131c0 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
131d0 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
131e0 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
131f0 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
13200 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
13210 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13220 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
13230 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
13240 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
13250 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
13260 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
13270 64 6c 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  dler,.          
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
132a0 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
132b0 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ager));.}../*.**
132c0 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
132d0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
132e0 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
132f0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
13300 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
13310 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
13320 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
13330 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
13340 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
13350 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
13360 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
13370 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
13380 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
13390 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
133a0 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
133b0 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
133c0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
133d0 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
133e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
133f0 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
13400 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
13410 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
13420 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
13430 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
13440 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
13450 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
13460 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
13470 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
13480 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
13490 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
134a0 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
134b0 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
134c0 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
134d0 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
134e0 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
134f0 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
13500 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
13510 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
13520 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
13530 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
13540 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13550 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
13560 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
13570 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
13580 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
13590 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
135a0 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
135b0 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
135c0 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
135d0 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
135e0 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
135f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13600 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
13610 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
13620 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
13630 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
13640 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
13650 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
13660 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
13670 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
13680 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
13690 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
136a0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
136b0 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
136c0 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
136d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
136e0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
136f0 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
13700 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
13710 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
13720 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
13730 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
13740 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
13750 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
13760 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
13770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
13780 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
13790 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
137a0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
137b0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
137c0 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
137d0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
137e0 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
137f0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
13800 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
13810 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
13820 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13840 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
13850 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
13860 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
13870 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
13880 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
13890 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
138a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
138b0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
138c0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
138d0 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
138e0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
138f0 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
13900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
13910 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
13920 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
13930 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
13940 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
13950 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
13960 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
13970 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
13980 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
13990 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
139a0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
139b0 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
139c0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
139d0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
139e0 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
139f0 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
13a00 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
13a10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
13a20 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
13a30 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
13a40 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
13a50 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
13a60 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
13a70 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
13a80 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
13a90 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
13aa0 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
13ab0 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
13ac0 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
13ad0 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13af0 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
13b00 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
13b10 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13b30 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
13b40 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
13b50 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
13b60 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
13b70 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
13b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13b90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13ba0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
13bb0 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
13bc0 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
13bd0 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
13be0 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
13bf0 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
13c00 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
13c10 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
13c20 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
13c30 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
13c40 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
13c50 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
13c60 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
13c70 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
13c80 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
13c90 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
13ca0 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
13cb0 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
13cc0 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
13cd0 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
13ce0 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
13cf0 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
13d00 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
13d10 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
13d20 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
13d30 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
13d40 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
13d50 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
13d60 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
13d70 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
13d80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
13d90 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
13da0 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
13db0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
13dc0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
13dd0 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
13de0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13df0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
13e00 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
13e10 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
13e20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
13e30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13e40 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
13e50 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
13e60 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
13e70 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
13e80 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
13e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13ea0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
13eb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13ec0 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
13ed0 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
13ee0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
13ef0 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
13f00 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
13f10 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
13f20 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
13f30 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
13f40 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
13f50 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
13f60 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
13f70 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
13f80 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
13f90 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
13fa0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
13fb0 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
13fc0 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
13fd0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
13fe0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
13ff0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
14000 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
14010 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
14020 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
14030 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
14040 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
14050 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
14060 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
14070 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14080 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
14090 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
140a0 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
140b0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
140c0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
140d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
140e0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
140f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14100 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
14110 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65  }.      if( isMe
14120 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mdb ){.        m
14130 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e  emcpy(zFullPathn
14140 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ame, zFilename, 
14150 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
14160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
14180 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
14190 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141c0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
141d0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
141e0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
141f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14200 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
14210 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
14220 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14230 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
14240 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14250 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
14260 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
14270 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
14280 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
14290 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
142a0 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
142b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
142c0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
142d0 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
142e0 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
142f0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
14300 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
14310 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
14320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14330 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
14340 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
14350 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
14360 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
14370 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
14380 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
14390 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
143a0 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
143b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
143c0 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
143d0 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
143e0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
143f0 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
14420 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
14430 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
14440 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
14450 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
14460 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
14470 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
14480 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
14490 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
144a0 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
144b0 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
144c0 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
144d0 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
144e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
144f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14500 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14510 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14520 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14530 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
14540 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14550 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
14560 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
14570 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14580 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
14590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
145a0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
145b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
145c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
145d0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
145e0 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
145f0 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
14600 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14610 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14620 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14630 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
14640 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14650 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
14660 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
14670 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
14680 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
14690 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
146a0 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
146b0 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
146c0 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
146d0 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
146e0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
146f0 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
14700 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
14710 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
14720 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
14730 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
14740 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14750 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
14760 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
14770 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
14780 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
14790 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
147a0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
147b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
147c0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
147d0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
147e0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
147f0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
14800 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
14810 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
14820 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
14830 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
14840 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
14850 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
14860 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
14870 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
14880 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
14890 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
148a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
148b0 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29  sizeof(i64)==8 )
148c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
148d0 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a  zeof(u64)==8 );.
148e0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
148f0 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
14900 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14910 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
14920 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
14930 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
14940 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
14950 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
14960 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
14970 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
14980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14990 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
149a0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
149b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
149c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
149d0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
149e0 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
149f0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
14a10 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20  izeof(MemPage), 
14a20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c  flags, vfsFlags,
14a30 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
14a40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
14a60 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
14a70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
14a80 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a  r, db->szMmap);.
14a90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14aa0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
14ab0 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
14ac0 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
14ad0 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
14ae0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
14af0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14b00 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
14b10 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
14b20 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
14b30 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
14b40 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
14b50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
14b60 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72  erSetBusyHandler
14b70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
14b80 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
14b90 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
14ba0 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
14bb0 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
14bc0 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
14bd0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
14be0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
14bf0 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
14c00 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62  pPager) ) pBt->b
14c10 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
14c20 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65  EAD_ONLY;.#if de
14c30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43  fined(SQLITE_SEC
14c40 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20  URE_DELETE).    
14c50 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14c60 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
14c70 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  TE;.#elif define
14c80 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53 45  d(SQLITE_FAST_SE
14c90 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20  CURE_DELETE).   
14ca0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
14cb0 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3b  = BTS_OVERWRITE;
14cc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
14cd0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
14ce0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
14cf0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
14d00 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
14d10 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
14d20 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
14d30 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
14d40 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
14d50 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
14d60 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
14d70 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
14d80 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
14d90 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
14da0 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
14db0 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
14dc0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
14dd0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
14de0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
14df0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
14e00 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
14e10 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
14e20 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
14e30 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
14e40 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
14e50 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
14e60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14e70 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
14e80 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
14e90 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
14ea0 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
14eb0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
14ec0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
14ed0 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
14ee0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
14ef0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
14f00 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
14f10 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
14f20 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
14f30 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
14f40 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
14f50 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
14f60 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
14f70 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
14f80 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
14f90 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
14fa0 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
14fb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
14fc0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
14fd0 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
14fe0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
14ff0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
15000 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
15010 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
15020 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
15030 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
15040 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
15050 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
15060 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
15070 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
15080 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
15090 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
150a0 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
150b0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
150c0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
150d0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
150e0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
150f0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
15100 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
15110 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
15120 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
15130 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
15140 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
15150 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
15160 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15170 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
15180 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
15190 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
151a0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
151b0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
151c0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
151d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
151e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
151f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
15200 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
15210 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
15220 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
15230 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
15240 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
15250 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
15260 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
15270 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
15280 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
15290 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
152a0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
152b0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
152c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
152d0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
152e0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
152f0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
15300 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
15310 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
15320 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
15330 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
15340 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
15350 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
15360 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15370 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15380 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
15390 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
153a0 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
153b0 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
153c0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
153d0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
153e0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
153f0 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65   */.    pBt->nRe
15400 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  f = 1;.    if( p
15410 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
15420 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
15430 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
15440 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
15450 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
15460 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
15470 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
15480 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
15490 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
154a0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
154b0 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
154c0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
154d0 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
154e0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
154f0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
15500 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
15510 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
15520 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
15530 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
15540 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
15550 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
15560 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
15570 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
15580 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15590 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
155a0 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
155b0 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
155c0 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
155d0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
155e0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
155f0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
15600 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
15610 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
15620 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
15630 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15640 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
15650 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
15660 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
15670 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
15680 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
15690 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
156a0 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
156b0 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
156c0 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
156d0 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
156e0 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
156f0 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
15700 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
15710 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
15720 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
15730 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
15740 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
15750 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
15760 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
15770 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
15780 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
15790 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
157a0 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
157b0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
157c0 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
157d0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
157e0 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
157f0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
15800 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
15810 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
15820 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
15830 20 20 20 20 20 20 20 69 66 28 20 28 75 70 74 72         if( (uptr
15840 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53  )p->pBt<(uptr)pS
15850 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
15860 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
15870 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
15880 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
15890 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
158a0 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
158b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
158c0 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
158d0 4e 65 78 74 20 26 26 20 28 75 70 74 72 29 70 53  Next && (uptr)pS
158e0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28  ib->pNext->pBt<(
158f0 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20  uptr)p->pBt ){. 
15900 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
15910 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
15920 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15930 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
15940 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
15950 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
15960 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
15970 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
15980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
15990 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
159a0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
159b0 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
159c0 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
159d0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
159e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
159f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
15a00 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
15a10 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
15a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15a30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
15a40 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
15a50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15a60 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
15a70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
15a80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15a90 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
15aa0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
15ab0 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
15ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
15ad0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b  te3_file *pFile;
15ae0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
15af0 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
15b00 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
15b10 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
15b20 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
15b30 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
15b40 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
15b50 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
15b60 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
15b70 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
15b80 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
15b90 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
15ba0 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
15bb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
15bc0 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
15bd0 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
15be0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
15bf0 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
15c00 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
15c10 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
15c20 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ZE);.    }..    
15c30 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
15c40 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
15c50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
15c60 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
15c70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
15c80 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
15c90 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46  (pFile, SQLITE_F
15ca0 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a  CNTL_PDB, (void*
15cb0 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20  )&pBt->db);.    
15cc0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
15cd0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
15ce0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15cf0 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
15d00 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
15d10 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
15d20 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
15d30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15d40 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
15d50 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43  BtreeConnectionC
15d60 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30  ount(*ppBtree)>0
15d70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
15d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
15d90 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
15da0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
15db0 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
15dc0 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
15dd0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
15de0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
15df0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
15e00 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
15e10 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
15e20 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
15e30 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
15e40 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
15e50 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
15e60 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
15e70 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
15e80 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
15e90 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
15ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15eb0 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
15ec0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15ed0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
15ee0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
15ef0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
15f00 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
15f10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15f20 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
15f30 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
15f40 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
15f50 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
15f60 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
15f70 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
15f80 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
15f90 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
15fa0 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
15fb0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
15fc0 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
15fd0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
15fe0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15ff0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
16000 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
16010 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
16020 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
16030 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
16040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
16050 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
16060 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
16070 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
16080 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
16090 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
160a0 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
160b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
160c0 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
160d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
160e0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
160f0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
16100 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
16110 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
16120 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
16130 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
16140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
16150 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
16160 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
16170 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
16180 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
16190 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
161a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
161b0 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
161c0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
161d0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
161e0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
161f0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
16200 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
16210 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
16220 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
16230 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
16240 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
16250 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
16260 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
16270 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
16280 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
16290 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
162a0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
162b0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
162c0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
162d0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
162e0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
162f0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
16300 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
16310 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
16320 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
16330 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
16340 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
16350 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
16360 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
16370 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
16380 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
16390 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
163a0 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
163b0 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
163c0 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
163d0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
163e0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
163f0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
16400 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
16410 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
16420 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
16430 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
16440 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
16450 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
16460 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
16470 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
16480 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
16490 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
164a0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
164b0 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
164c0 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
164d0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
164e0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
164f0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
16500 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
16510 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
16520 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
16530 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
16540 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
16550 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
16560 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
16570 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
16580 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
16590 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
165a0 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
165b0 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
165c0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
165d0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
165e0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
165f0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
16600 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
16610 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
16620 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
16630 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
16640 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
16650 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
16660 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
16670 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
16680 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
16690 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
166a0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
166b0 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
166c0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
166d0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
166e0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
166f0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
16700 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
16710 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
16720 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
16730 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
16740 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
16750 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
16760 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
16770 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
16780 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
16790 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
167a0 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
167b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
167c0 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
167d0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
167e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
167f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
16800 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
16810 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
16820 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
16830 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
16840 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16850 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
16860 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16870 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
16880 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
16890 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
168a0 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
168b0 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
168c0 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
168d0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
168e0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
168f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16900 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
16910 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
16920 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
16930 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
16940 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
16950 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
16960 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
16970 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
16980 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
16990 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
169a0 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
169b0 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
169c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
169d0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
169e0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
169f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16a00 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
16a10 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
16a20 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
16a30 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
16a40 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
16a50 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
16a60 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
16a70 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
16a80 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
16a90 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
16aa0 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
16ab0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16ac0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
16ad0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
16ae0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
16af0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
16b00 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
16b10 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
16b20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
16b30 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
16b40 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
16b50 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
16b60 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
16b70 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
16b80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
16b90 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
16ba0 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
16bb0 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
16bc0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16bd0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
16be0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
16bf0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
16c00 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42  >db);.    if( pB
16c10 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
16c20 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
16c30 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
16c40 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
16c50 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
16c60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16c70 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  0, pBt->pSchema)
16c80 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
16c90 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ace(pBt);.    sq
16ca0 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
16cb0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16cc0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
16cd0 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28  _CACHE.  assert(
16ce0 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
16cf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
16d00 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
16d10 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20   if( p->pPrev ) 
16d20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
16d30 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66  = p->pNext;.  if
16d40 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e  ( p->pNext ) p->
16d50 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
16d60 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a  ->pPrev;.#endif.
16d70 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16d80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
16d90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16da0 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66   Change the "sof
16db0 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  t" limit on the 
16dc0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
16dd0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
16de0 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f   Unused and unmo
16df0 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c  dified pages wil
16e00 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68  l be recycled wh
16e10 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
16e20 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65  .** pages in the
16e30 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74   cache exceeds t
16e40 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20  his soft limit. 
16e50 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66   But the size of
16e60 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73   the.** cache is
16e70 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77   allowed to grow
16e80 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
16e90 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f  s limit if it co
16ea0 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20  ntains.** dirty 
16eb0 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73  pages or pages s
16ec0 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75  till in active u
16ed0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
16ee0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
16ef0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
16f00 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
16f10 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16f20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
16f30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16f40 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
16f50 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16f60 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
16f70 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
16f80 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
16f90 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
16fa0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16fb0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
16fc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16fd0 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69   Change the "spi
16fe0 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ll" limit on the
16ff0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
17000 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
17010 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
17020 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73  of pages exceeds
17030 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69   this limit duri
17040 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ng a write trans
17050 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70  action,.** the p
17060 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d  ager might attem
17070 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61  pt to "spill" pa
17080 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ges to the journ
17090 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f  al early in.** o
170a0 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
170b0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
170c0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
170d0 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   is the current 
170e0 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20  spill size.  If 
170f0 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a  zero is passed.*
17100 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
17110 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  , no changes are
17120 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69   made to the spi
17130 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c  ll size setting,
17140 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50   so.** using mxP
17150 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61  age of 0 is a wa
17160 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63  y to query the c
17170 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
17180 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17190 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69  3BtreeSetSpillSi
171a0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
171b0 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
171c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
171d0 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  Bt;.  int res;. 
171e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
171f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
17200 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
17210 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17220 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  (p);.  res = sql
17230 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c  ite3PagerSetSpil
17240 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  lsize(pBt->pPage
17250 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
17260 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17270 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  p);.  return res
17280 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
17290 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
172a0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
172b0 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
172c0 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
172d0 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
172e0 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
172f0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
17300 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
17310 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
17320 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
17330 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
17340 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17350 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
17360 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17370 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
17380 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17390 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
173a0 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
173b0 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
173c0 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
173d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
173e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
173f0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
17400 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
17410 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
17420 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
17430 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
17440 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
17450 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
17460 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
17470 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
17480 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
17490 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
174a0 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
174b0 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
174c0 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
174d0 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
174e0 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
174f0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
17500 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
17510 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
17520 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
17530 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
17540 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
17550 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
17560 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
17570 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
17580 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
17590 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
175a0 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
175b0 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
175c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
175d0 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
175e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
175f0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
17600 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
17610 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
17620 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
17630 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
17640 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
17650 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
17660 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
17670 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
17680 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
17690 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
176a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
176b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
176c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
176d0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
176e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
176f0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
17700 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
17710 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
17720 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
17730 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17750 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17760 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
17770 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
17780 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
17790 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
177a0 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
177b0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
177c0 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
177d0 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
177e0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
177f0 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
17800 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
17810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
17820 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
17830 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
17840 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
17850 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
17860 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
17870 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
17880 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
17890 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
178a0 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
178b0 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
178c0 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
178d0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
178e0 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
178f0 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
17900 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
17910 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
17920 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
17930 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
17940 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
17950 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
17960 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
17970 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
17980 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
17990 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
179a0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
179b0 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
179c0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
179d0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
179e0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
179f0 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
17a00 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
17a10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
17a20 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
17a30 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  e BTS_PAGESIZE_F
17a40 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74  IXED flag is set
17a50 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
17a60 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
17a70 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
17a80 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
17a90 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
17aa0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
17ab0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
17ac0 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
17ad0 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
17ae0 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
17af0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17b00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17b10 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
17b20 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
17b30 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
17b40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17b50 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53  eEnter(p);.#if S
17b60 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
17b70 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70    if( nReserve>p
17b80 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17b90 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61  ve ) pBt->optima
17ba0 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e  lReserve = (u8)n
17bb0 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
17bc0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
17bd0 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
17be0 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
17bf0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17c00 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
17c10 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17c20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
17c30 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
17c40 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
17c50 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
17c60 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
17c70 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
17c80 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
17c90 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
17ca0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
17cb0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
17cc0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
17cd0 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
17ce0 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
17cf0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
17d00 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
17d10 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
17d20 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
17d30 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
17d40 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
17d50 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
17d60 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
17d70 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
17d80 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
17d90 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
17da0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
17db0 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
17dc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
17dd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
17de0 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
17df0 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
17e00 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17e10 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
17e20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17e30 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17e40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17e50 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
17e60 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
17e70 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
17e80 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
17e90 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
17ea0 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
17eb0 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
17ec0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17ed0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
17ee0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17ef0 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
17f00 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
17f10 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
17f20 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
17f30 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
17f40 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
17f50 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
17f60 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
17f70 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
17f80 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
17f90 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
17fa0 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
17fb0 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
17fc0 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
17fd0 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
17fe0 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
17ff0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
18000 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
18010 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
18020 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
18030 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
18040 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
18050 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
18060 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
18070 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
18080 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
18090 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
180a0 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
180b0 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
180c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
180d0 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
180e0 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
180f0 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  int n;.  assert(
18100 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
18110 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
18120 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  x) );.  n = p->p
18130 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
18140 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
18150 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  e;.  return n;.}
18160 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18170 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18180 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
18190 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
181a0 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
181b0 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
181c0 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
181d0 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
181e0 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
181f0 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
18200 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
18210 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
18220 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65  _HAS_MUTEX is de
18230 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e  fined then the n
18240 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
18250 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72  s the.** greater
18260 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
18270 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61  reserved space a
18280 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72  nd the maximum r
18290 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65  equested.** rese
182a0 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e  rve space..*/.in
182b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
182c0 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28  tOptimalReserve(
182d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
182e0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
182f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
18300 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
18310 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
18320 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
18330 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
18340 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  ( n<p->pBt->opti
18350 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d  malReserve ) n =
18360 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c   p->pBt->optimal
18370 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
18380 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18390 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
183a0 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65   n;.}.../*.** Se
183b0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
183c0 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
183d0 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
183e0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
183f0 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
18400 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
18410 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
18420 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
18430 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
18440 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
18450 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
18460 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
18470 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
18480 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
18490 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
184a0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
184b0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
184c0 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
184d0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
184e0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
184f0 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
18500 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18510 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
18520 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
18530 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42 54  alues for the BT
18540 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
18550 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
18560 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  E flags:.**.**  
18570 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20 20    newFlag==0    
18580 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43 55     Both BTS_SECU
18590 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54  RE_DELETE and BT
185a0 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65 20  S_OVERWRITE are 
185b0 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65  cleared.**    ne
185c0 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20 42  wFlag==1       B
185d0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
185e0 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56 45   set and BTS_OVE
185f0 52 57 52 49 54 45 20 69 73 20 63 6c 65 61 72 65  RWRITE is cleare
18600 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  d.**    newFlag=
18610 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53 45 43  =2       BTS_SEC
18620 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61 72  URE_DELETE clear
18630 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  ed and BTS_OVERW
18640 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20 20  RITE is set.**  
18650 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20    newFlag==(-1) 
18660 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a     No changes.**
18670 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18680 20 61 63 74 73 20 61 73 20 61 20 71 75 65 72 79   acts as a query
18690 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 6c   if newFlag is l
186a0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a  ess than zero.**
186b0 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56 45  .** With BTS_OVE
186c0 52 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c 65  RWRITE set, dele
186d0 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f  ted content is o
186e0 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a 65  verwritten by ze
186f0 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65  ros, but.** free
18700 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20  list leaf pages 
18710 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  are not written 
18720 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
18730 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d 70  base.  Thus in-p
18740 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63  age.** deleted c
18750 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72 65  ontent is cleare
18760 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74 20  d, but freelist 
18770 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20  deleted content 
18780 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  is not..**.** Wi
18790 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  th BTS_SECURE_DE
187a0 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20  LETE, operation 
187b0 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52  is like BTS_OVER
187c0 57 52 49 54 45 20 77 69 74 68 20 74 68 65 20 61  WRITE with the a
187d0 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ddition.** that 
187e0 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
187f0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
18800 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
18810 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73 69  tabase, increasi
18820 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74  ng.** the amount
18830 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f   of disk I/O..*/
18840 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18850 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
18860 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
18870 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
18880 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
18890 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
188a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
188b0 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45 52  assert( BTS_OVER
188c0 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55 52  WRITE==BTS_SECUR
188d0 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20  E_DELETE*2 );.  
188e0 61 73 73 65 72 74 28 20 42 54 53 5f 46 41 53 54  assert( BTS_FAST
188f0 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56  _SECURE==(BTS_OV
18900 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43 55  ERWRITE|BTS_SECU
18910 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20 20  RE_DELETE) );.  
18920 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
18930 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
18940 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 46  sFlags &= ~BTS_F
18950 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20 20  AST_SECURE;.    
18960 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
18970 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
18980 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20  ELETE*newFlag;. 
18990 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74   }.  b = (p->pBt
189a0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
189b0 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42 54  _FAST_SECURE)/BT
189c0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
189d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
189e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
189f0 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
18a00 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
18a10 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
18a20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
18a30 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
18a40 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
18a50 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
18a60 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
18a70 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
18a80 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
18a90 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
18aa0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
18ab0 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
18ac0 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
18ad0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
18ae0 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
18af0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
18b00 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
18b10 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
18b20 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
18b30 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
18b40 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
18b50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
18b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18b70 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
18b80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18b90 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
18ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18bb0 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
18bc0 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
18bd0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18be0 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
18bf0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
18c00 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
18c10 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
18c20 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
18c30 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18c40 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
18c50 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
18c60 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
18c70 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
18c80 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
18c90 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
18ca0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18cb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
18cc0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
18cd0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
18ce0 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
18cf0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
18d00 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
18d10 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
18d20 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
18d30 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
18d40 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
18d50 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
18d60 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
18d70 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18d80 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
18d90 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
18da0 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
18db0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
18dc0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
18dd0 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
18de0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
18df0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
18e00 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
18e10 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
18e20 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18e30 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
18e40 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
18e50 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
18e60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18e70 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
18e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
18e90 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65   user has not se
18ea0 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  t the safety-lev
18eb0 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  el for this data
18ec0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
18ed0 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41  ** using "PRAGMA
18ee0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61   synchronous", a
18ef0 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79  nd if the safety
18f00 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c  -level is not al
18f10 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20  ready.** set to 
18f20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
18f30 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
18f40 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  n as the second 
18f50 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65  parameter,.** se
18f60 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20  t it so..*/.#if 
18f70 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
18f80 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49  YNCHRONOUS!=SQLI
18f90 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
18fa0 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20  YNCHRONOUS \.   
18fb0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
18fc0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74  ITE_OMIT_WAL).st
18fd0 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 66  atic void setDef
18fe0 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53  aultSyncFlag(BtS
18ff0 68 61 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73  hared *pBt, u8 s
19000 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20  afety_level){.  
19010 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
19020 62 20 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64  b *pDb;.  if( (d
19030 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26  b=pBt->db)!=0 &&
19040 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d   (pDb=db->aDb)!=
19050 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
19060 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70  pDb->pBt==0 || p
19070 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42  Db->pBt->pBt!=pB
19080 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20  t ){ pDb++; }.  
19090 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63    if( pDb->bSync
190a0 53 65 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Set==0 .     && 
190b0 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
190c0 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  l!=safety_level 
190d0 0a 20 20 20 20 20 26 26 20 70 44 62 21 3d 26 64  .     && pDb!=&d
190e0 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29  b->aDb[1] .    )
190f0 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66  {.      pDb->saf
19100 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65  ety_level = safe
19110 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20  ty_level;.      
19120 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
19130 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
19140 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
19150 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20  >safety_level | 
19160 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47  (db->flags & PAG
19170 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b  ER_FLAGS_MASK));
19180 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
19190 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44  se.# define setD
191a0 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
191b0 42 74 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  Bt,safety_level)
191c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77  .#endif../* Forw
191d0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
191e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
191f0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
19200 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ed*);.../*.** Ge
19210 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
19220 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
19230 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
19240 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
19250 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
19260 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
19270 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
19280 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
19290 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
192a0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
192b0 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
192c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
192d0 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
192e0 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
192f0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
19300 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
19310 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
19320 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
19330 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
19340 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
19350 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
19360 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
19370 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
19380 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
19390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
193a0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
193b0 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
193c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
193d0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
193e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
193f0 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50  file */.  u32 nP
19400 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
19410 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19420 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
19430 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65  e */.  u32 nPage
19440 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
19450 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19460 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
19470 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ile */.  u32 nPa
19480 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
19490 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
194a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
194b0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
194c0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
194d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
194e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
194f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
19500 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
19510 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19520 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
19530 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
19540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19550 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
19560 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
19570 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
19580 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
19590 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
195a0 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
195b0 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
195c0 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
195d0 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
195e0 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
195f0 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
19600 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
19610 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
19620 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
19630 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
19640 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
19650 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
19660 70 50 61 67 65 72 2c 20 28 69 6e 74 2a 29 26 6e  pPager, (int*)&n
19670 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
19680 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
19690 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
196a0 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
196b0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
196c0 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
196d0 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
196e0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d  .  }.  if( (pBt-
196f0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
19700 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73  ITE_ResetDatabas
19710 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  e)!=0 ){.    nPa
19720 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ge = 0;.  }.  if
19730 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
19740 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
19750 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
19760 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
19770 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
19780 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
19790 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
197a0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
197b0 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
197c0 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
197d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
197e0 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
197f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
19800 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
19810 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
19820 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
19830 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
19840 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
19850 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
19860 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
19870 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
19880 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19890 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
198a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
198b0 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
198c0 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
198d0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
198e0 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
198f0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
19900 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
19910 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19920 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19930 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
19940 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
19950 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
19960 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
19970 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
19980 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
19990 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
199a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
199b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
199c0 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
199d0 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
199e0 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
199f0 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
19a00 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
19a10 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
19a20 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
19a30 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
19a40 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
19a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a60 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
19a70 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
19a80 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
19a90 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
19aa0 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
19ab0 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
19ac0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
19ad0 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
19ae0 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
19af0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
19b00 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
19b10 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
19b20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
19b30 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
19b40 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
19b50 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
19b60 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
19b70 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19b80 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
19b90 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
19ba0 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
19bb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
19bc0 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
19bd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19be0 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
19bf0 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
19c00 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
19c10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19c20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
19c30 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19c40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19c50 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79      setDefaultSy
19c60 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49  ncFlag(pBt, SQLI
19c70 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
19c80 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20  YNCHRONOUS+1);. 
19c90 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65         if( isOpe
19ca0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
19cb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
19cc0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
19cd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19ce0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
19cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
19d00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
19d10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19d20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
19d30 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
19d40 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
19d50 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a  ONOUS+1);.    }.
19d60 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
19d70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
19d80 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
19d90 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
19da0 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
19db0 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
19dc0 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
19dd0 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
19de0 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
19df0 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
19e00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19e10 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
19e20 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
19e30 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
19e40 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
19e50 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
19e60 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
19e70 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
19e80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
19e90 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
19ea0 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
19eb0 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
19ec0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19ed0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
19ee0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19ef0 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
19f00 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
19f10 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19f20 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19f30 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
19f40 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
19f50 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
19f60 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
19f70 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
19f80 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
19f90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
19fa0 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
19fb0 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
19fc0 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
19fd0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19fe0 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
19ff0 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
1a000 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
1a010 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
1a020 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
1a030 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
1a040 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
1a050 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
1a060 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
1a070 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
1a080 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
1a090 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
1a0a0 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
1a0b0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a0c0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1a0d0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1a0e0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1a0f0 5f 46 49 58 45 44 3b 0a 20 20 20 20 61 73 73 65  _FIXED;.    asse
1a100 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
1a110 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20  7)==0 );.    /* 
1a120 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
1a130 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22  9310-51205 The "
1a140 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20  reserved space" 
1a150 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79  size in the 1-by
1a160 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  te.    ** intege
1a170 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69  r at offset 20 i
1a180 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a190 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
1a1a0 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20  t the end of.   
1a1b0 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f   ** each page to
1a1c0 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74   reserve for ext
1a1d0 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a  ensions. .    **
1a1e0 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  .    ** EVIDENCE
1a1f0 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
1a200 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
1a210 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
1a220 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  on is.    ** det
1a230 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
1a240 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
1a250 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
1a260 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
1a270 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  0.    ** into th
1a280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a290 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75  header. */.    u
1a2a0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
1a2b0 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
1a2c0 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70  ;.    if( (u32)p
1a2d0 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
1a2e0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
1a2f0 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
1a300 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1a310 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a320 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
1a330 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
1a340 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
1a350 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
1a360 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
1a370 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
1a380 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
1a390 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
1a3a0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
1a3b0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1a3c0 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
1a3d0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1a3e0 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
1a3f0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
1a400 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
1a410 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
1a420 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
1a430 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
1a440 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
1a450 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ne(pPage1);.    
1a460 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
1a470 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
1a480 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
1a490 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
1a4a0 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
1a4b0 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
1a4c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a4d0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
1a4e0 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
1a4f0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1a520 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
1a530 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a540 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1a550 28 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c  ( sqlite3Writabl
1a560 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 64 62 29  eSchema(pBt->db)
1a570 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61  ==0 && nPage>nPa
1a580 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  geFile ){.      
1a590 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1a5a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1a5b0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1a5c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1a5d0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a5e0 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20  : R-28312-64704 
1a5f0 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61  However, the usa
1a600 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ble size is not 
1a610 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a  allowed to.    *
1a620 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  * be less than 4
1a630 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  80. In other wor
1a640 64 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ds, if the page 
1a650 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65  size is 512, the
1a660 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73  n the.    ** res
1a670 65 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65  erved space size
1a680 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33   cannot exceed 3
1a690 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73  2. */.    if( us
1a6a0 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a  ableSize<480 ){.
1a6b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1a6c0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1a6d0 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
1a6e0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1a6f0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
1a700 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1a710 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
1a720 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a730 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
1a740 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
1a750 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
1a760 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
1a770 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
1a780 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
1a790 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
1a7a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
1a7b0 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
1a7c0 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
1a7d0 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
1a7e0 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
1a7f0 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
1a800 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
1a810 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
1a820 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
1a830 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
1a840 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
1a850 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
1a860 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
1a870 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
1a880 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
1a890 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
1a8a0 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
1a8b0 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
1a8c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
1a8d0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
1a8e0 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
1a8f0 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
1a900 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
1a910 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
1a920 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
1a930 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
1a940 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
1a950 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
1a960 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
1a970 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61  e pointer, a hea
1a980 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
1a990 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
1a9a0 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
1a9b0 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
1a9c0 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
1a9d0 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
1a9e0 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
1a9f0 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
1aa00 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
1aa10 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
1aa20 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
1aa30 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 23);.  pBt->m
1aa40 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  inLocal = (u16)(
1aa50 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1aa60 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
1aa70 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  );.  pBt->maxLea
1aa80 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  f = (u16)(pBt->u
1aa90 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b  sableSize - 35);
1aaa0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20  .  pBt->minLeaf 
1aab0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1aac0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
1aad0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28  255 - 23);.  if(
1aae0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31   pBt->maxLocal>1
1aaf0 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  27 ){.    pBt->m
1ab00 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
1ab10 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   127;.  }else{. 
1ab20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
1ab30 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42  Payload = (u8)pB
1ab40 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d  t->maxLocal;.  }
1ab50 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1ab60 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
1ab70 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
1ab80 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
1ab90 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70  e1 = pPage1;.  p
1aba0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1abb0 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1abc0 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e  TE_OK;..page1_in
1abd0 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c  it_failed:.  rel
1abe0 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1abf0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
1ac00 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
1ac10 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1ac20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
1ac30 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1ac40 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
1ac50 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
1ac60 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1ac70 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1ac80 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1ac90 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1aca0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1acb0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
1acc0 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
1acd0 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
1ace0 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
1acf0 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
1ad00 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
1ad10 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1ad20 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
1ad30 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
1ad40 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
1ad50 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1ad60 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1ad70 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
1ad80 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
1ad90 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
1ada0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
1adb0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1adc0 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1add0 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1ade0 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1adf0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1ae00 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1ae10 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1ae20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1ae30 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1ae40 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1ae50 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1ae60 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1ae70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1ae80 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1ae90 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1aea0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1aeb0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1aec0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1aed0 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1aee0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1aef0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1af00 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1af10 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1af20 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1af30 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1af40 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1af50 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1af60 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1af70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1af80 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1af90 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1afa0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1afb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1afc0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1afd0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1afe0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1aff0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1b000 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1b010 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1b020 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1b030 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1b040 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1b050 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1b060 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1b070 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b080 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1b090 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1b0a0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1b0b0 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1b0c0 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1b0d0 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1b0e0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1b0f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1b100 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1b110 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1b120 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b130 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1b140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b150 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1b160 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b170 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1b180 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1b190 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1b1a0 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1b1b0 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
1b1c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b1d0 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
1b1e0 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
1b1f0 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
1b200 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
1b210 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
1b220 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
1b230 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
1b240 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
1b250 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
1b260 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
1b270 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
1b280 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
1b290 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
1b2a0 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
1b2b0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1b2c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b2d0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1b2e0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
1b2f0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
1b300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b310 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
1b320 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
1b330 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
1b340 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
1b350 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1b360 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
1b370 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
1b380 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1b390 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
1b3a0 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
1b3b0 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1b3c0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
1b3d0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
1b3e0 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
1b3f0 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
1b400 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
1b410 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
1b420 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
1b430 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
1b440 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
1b450 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
1b460 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
1b470 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
1b480 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
1b490 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
1b4a0 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
1b4b0 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
1b4c0 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
1b4d0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
1b4e0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1b4f0 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
1b500 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
1b510 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
1b520 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
1b530 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
1b540 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
1b550 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
1b560 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
1b570 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1b580 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
1b590 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
1b5a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b5b0 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
1b5c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
1b5d0 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
1b5e0 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
1b5f0 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
1b600 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
1b610 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
1b620 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1b630 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
1b640 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1b650 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
1b660 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
1b670 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
1b680 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  dif.  pBt->nPage
1b690 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d   = 1;.  data[31]
1b6a0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
1b6b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b6c0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
1b6d0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1b6e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b6f0 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61  e (creating a da
1b700 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73  tabase.** consis
1b710 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
1b720 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68   page and no sch
1b730 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65  ema objects). Re
1b740 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1b750 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
1b760 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
1b770 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
1b780 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
1b790 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72  e3BtreeNewDb(Btr
1b7a0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1b7b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b7c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
1b7d0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
1b7e0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1b7f0 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c  e(p->pBt);.  sql
1b800 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b810 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b820 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1b830 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
1b840 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
1b850 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b860 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
1b870 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1b880 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
1b890 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
1b8a0 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
1b8b0 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
1b8c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
1b8d0 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
1b8e0 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
1b8f0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1b900 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
1b910 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
1b920 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
1b930 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
1b940 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
1b950 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
1b960 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
1b970 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
1b980 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
1b990 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
1b9a0 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
1b9b0 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
1b9c0 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
1b9d0 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
1b9e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
1b9f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1ba00 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
1ba10 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
1ba20 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
1ba30 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1ba40 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
1ba50 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
1ba60 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
1ba70 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
1ba80 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
1ba90 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
1baa0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1bab0 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
1bac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1bad0 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
1bae0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1baf0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
1bb00 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1bb10 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
1bb20 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1bb30 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
1bb40 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1bb50 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
1bb60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
1bb70 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
1bb80 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
1bb90 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
1bba0 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
1bbb0 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
1bbc0 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
1bbd0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1bbe0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1bbf0 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
1bc00 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
1bc10 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
1bc20 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
1bc30 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
1bc40 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
1bc50 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
1bc60 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
1bc70 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
1bc80 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1bc90 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
1bca0 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
1bcb0 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
1bcc0 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
1bcd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
1bce0 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
1bcf0 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
1bd00 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
1bd10 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
1bd20 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
1bd30 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
1bd40 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
1bd50 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
1bd60 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
1bd70 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1bd80 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
1bd90 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
1bda0 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1bdb0 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
1bdc0 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
1bdd0 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
1bde0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
1bdf0 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
1be00 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
1be10 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
1be20 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
1be30 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
1be40 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
1be50 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
1be60 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
1be70 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
1be80 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
1be90 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
1bea0 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
1beb0 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
1bec0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1bed0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
1bee0 69 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e 74 20  int wrflag, int 
1bef0 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 29  *pSchemaVersion)
1bf00 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1bf10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1bf20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1bf30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1bf40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1bf50 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1bf60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
1bf70 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
1bf80 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1bf90 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
1bfa0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1bfb0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1bfc0 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
1bfd0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
1bfe0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
1bff0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1c000 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1c010 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1c020 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
1c030 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
1c040 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
1c050 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1c060 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1c070 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c080 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1c090 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
1c0a0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
1c0b0 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 2d 3e  0 );..  if( (p->
1c0c0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1c0d0 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
1c0e0 29 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ) .   && sqlite3
1c0f0 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
1c100 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20  pBt->pPager)==0 
1c110 0a 20 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 62  .  ){.    pBt->b
1c120 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1c130 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  READ_ONLY;.  }..
1c140 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
1c150 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1c160 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
1c170 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1c180 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
1c190 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1c1a0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
1c1b0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
1c1c0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1c1d0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
1c1e0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
1c1f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c200 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1c210 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20    {.    sqlite3 
1c220 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *pBlock = 0;.   
1c230 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
1c240 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
1c250 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
1c260 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
1c270 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e  ction .    ** on
1c280 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
1c290 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
1c2a0 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
1c2b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
1c2c0 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c     ** requested,
1c2d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1c2e0 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  OCKED..    */.  
1c2f0 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
1c300 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c310 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1c320 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e  ).     || (pBt->
1c330 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1c340 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29  ENDING)!=0.    )
1c350 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d  {.      pBlock =
1c360 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1c370 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
1c380 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
1c390 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
1c3a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1c3b0 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1c3c0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1c3d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1c3e0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1c3f0 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
1c400 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
1c410 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
1c420 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c440 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1c450 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   pBlock ){.     
1c460 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1c470 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1c480 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20   pBlock);.      
1c490 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1c4a0 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1c4b0 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
1c4c0 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20  _begun;.    }.  
1c4d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
1c4e0 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
1c4f0 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
1c500 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
1c510 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
1c520 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
1c530 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
1c540 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
1c550 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
1c560 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
1c570 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
1c580 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
1c590 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
1c5a0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
1c5b0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1c5c0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
1c5d0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
1c5e0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1c5f0 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
1c600 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
1c610 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
1c620 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1c630 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
1c640 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
1c650 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
1c660 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
1c670 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
1c680 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
1c690 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
1c6a0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
1c6b0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
1c6c0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
1c6d0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1c6e0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
1c6f0 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
1c700 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1c710 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
1c720 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
1c730 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
1c740 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
1c750 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
1c760 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
1c770 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1c780 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
1c790 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
1c7a0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
1c7b0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
1c7c0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
1c7d0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
1c7e0 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
1c7f0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1c800 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
1c810 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
1c820 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
1c830 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
1c840 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
1c850 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c860 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1c870 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
1c880 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1c890 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1c8a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c8b0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1c8c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c8d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c8e0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
1c8f0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
1c900 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
1c910 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
1c920 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c940 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1c950 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1c960 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1c970 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53  c==SQLITE_BUSY_S
1c980 4e 41 50 53 48 4f 54 20 26 26 20 70 42 74 2d 3e  NAPSHOT && pBt->
1c990 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1c9a0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1c9b0 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65         /* if the
1c9c0 72 65 20 77 61 73 20 6e 6f 20 74 72 61 6e 73 61  re was no transa
1c9d0 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65  ction opened whe
1c9e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1c9f0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1ca00 20 63 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49   called and SQLI
1ca10 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
1ca20 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 63 68   is returned, ch
1ca30 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 0a 20  ange the error. 
1ca40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1ca50 20 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   to SQLITE_BUSY.
1ca60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1ca70 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1ca80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ca90 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1caa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cab0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
1cac0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1cad0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
1cae0 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
1caf0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
1cb00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1cb10 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
1cb20 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
1cb30 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
1cb40 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  (pBt) );.  sqlit
1cb50 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b  e3PagerResetLock
1cb60 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61  Timeout(pBt->pPa
1cb70 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ger);..  if( rc=
1cb80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cb90 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1cba0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1cbb0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1cbc0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
1cbd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1cbe0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1cbf0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
1cc00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1cc10 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
1cc20 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
1cc30 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
1cc40 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
1cc50 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
1cc60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1cc70 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
1cc80 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
1cc90 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
1cca0 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
1ccb0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
1ccc0 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
1ccd0 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
1cce0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
1ccf0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
1cd00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1cd10 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
1cd20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1cd30 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
1cd40 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1cd50 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1cd60 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1cd70 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1cd80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1cd90 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1cda0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1cdb0 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1cdc0 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1cdd0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1cde0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1cdf0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1ce00 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1ce10 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1ce20 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1ce30 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1ce40 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1ce50 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1ce60 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1ce70 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1ce80 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1ce90 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1cea0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ceb0 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1cec0 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1ced0 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1cee0 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1cef0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1cf00 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1cf10 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1cf20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1cf30 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1cf40 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1cf50 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1cf60 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1cf70 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1cf80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cf90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cfa0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1cfb0 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1cfc0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1cfd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1cfe0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1cff0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1d000 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d020 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1d030 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1d040 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1d050 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d060 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d070 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
1d080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d090 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68   ){.    if( pSch
1d0a0 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20  emaVersion ){.  
1d0b0 20 20 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73      *pSchemaVers
1d0c0 69 6f 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26  ion = get4byte(&
1d0d0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1d0e0 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20  ta[40]);.    }. 
1d0f0 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1d100 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
1d110 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1d120 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1d130 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1d140 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a  mber of.      **
1d150 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1d160 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1d170 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1d180 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1d190 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62        ** the sub
1d1a0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
1d1b0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
1d1c0 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
1d1d0 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20  ened here..     
1d1e0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1d1f0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1d200 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1d210 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
1d220 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
1d230 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1d240 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
1d250 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1d260 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d270 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d280 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1d290 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1d2a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
1d2b0 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
1d2c0 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
1d2d0 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
1d2e0 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
1d2f0 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
1d300 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1d310 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
1d320 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
1d330 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
1d340 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
1d350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d360 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1d370 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1d380 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3a0 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
1d3b0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
1d3c0 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1d3f0 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
1d400 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d430 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
1d440 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d450 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
1d460 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
1d470 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
1d480 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d490 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1d4a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1d4b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f   pPage->isInit ?
1d4c0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72   SQLITE_OK : btr
1d4d0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1d4e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1d4f0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1d500 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  rc;.  nCell = pP
1d510 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
1d520 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1d530 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1d540 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1d550 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
1d560 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
1d570 28 70 50 61 67 65 2c 20 70 50 61 67 65 2c 20 70  (pPage, pPage, p
1d580 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1d590 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1d5a0 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1d5b0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1d5c0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1d5d0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1d5e0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1d5f0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1d600 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1d610 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1d620 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1d630 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1d640 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d650 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d660 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1d670 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1d680 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1d690 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1d6a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1d6b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1d6c0 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1d6d0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1d6e0 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1d6f0 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1d700 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1d710 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1d720 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1d730 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1d740 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1d750 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1d760 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1d770 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1d780 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1d790 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1d7a0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1d7b0 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d7d0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1d7e0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1d7f0 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1d800 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1d810 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1d820 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1d830 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d840 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1d850 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1d860 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1d870 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1d880 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1d890 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1d8a0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1d8b0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1d8c0 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1d8d0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1d8e0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1d8f0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1d900 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1d910 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1d920 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1d930 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1d940 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1d950 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1d960 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1d970 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1d980 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1d990 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1d9a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1d9b0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d9c0 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1d9d0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1d9e0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1d9f0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1da00 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1da10 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1da20 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1da30 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1da40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1da50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1da60 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1da70 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
1da80 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
1da90 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
1daa0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1dab0 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  nCell;.    int r
1dac0 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61  c;..    rc = pPa
1dad0 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c  ge->isInit ? SQL
1dae0 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e  ITE_OK : btreeIn
1daf0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1db00 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1db10 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
1db20 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1db30 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1db40 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1db50 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1db60 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1db70 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1db80 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1db90 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1dba0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1dbb0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
1dbc0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
1dbd0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1dbe0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1dbf0 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
1dc00 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
1dc10 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66     if( pCell+inf
1dc20 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d  o.nSize > pPage-
1dc30 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42  >aData+pPage->pB
1dc40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
1dc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1dc60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1dc70 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
1dc80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dc90 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
1dca0 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b  =get4byte(pCell+
1dcb0 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b  info.nSize-4) ){
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1dcd0 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1dce0 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a  .nSize-4, iTo);.
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1dd00 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1dd10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dd20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1dd30 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
1dd40 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
1dd50 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1dd60 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
1dd70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1dd90 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1dda0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
1ddb0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1ddc0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
1ddd0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
1dde0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ddf0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1de00 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
1de10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1de20 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
1de30 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1de40 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1de50 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1de60 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1de70 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  ], iTo);.    }. 
1de80 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1de90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1dea0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
1deb0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1dec0 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
1ded0 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
1dee0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
1def0 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
1df00 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
1df10 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
1df20 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
1df30 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
1df40 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
1df50 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
1df60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
1df70 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
1df80 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
1df90 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
1dfa0 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
1dfb0 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
1dfc0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1dfd0 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
1dfe0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
1dff0 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
1e000 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
1e010 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1e020 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1e030 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
1e040 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
1e050 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1e060 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
1e070 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
1e080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1e090 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
1e0a0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1e0b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
1e0c0 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
1e0d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1e0e0 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
1e0f0 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1e100 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
1e110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e120 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
1e130 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
1e140 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1e150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
1e160 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
1e170 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
1e180 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
1e190 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
1e1a0 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
1e1b0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1e1c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1e1d0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1e1e0 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
1e1f0 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
1e200 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1e210 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1e220 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
1e230 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1e240 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
1e250 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1e260 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
1e270 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1e280 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1e290 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
1e2a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1e2b0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1e2c0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1e2d0 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
1e2e0 70 42 74 20 29 3b 0a 20 20 69 66 28 20 69 44 62  pBt );.  if( iDb
1e2f0 50 61 67 65 3c 33 20 29 20 72 65 74 75 72 6e 20  Page<3 ) return 
1e300 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e310 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  KPT;..  /* Move 
1e320 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1e330 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1e340 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1e350 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1e360 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1e370 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1e380 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1e390 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1e3a0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1e3b0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1e3c0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1e3d0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1e3e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1e3f0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1e400 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1e410 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1e420 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1e430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1e450 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1e460 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1e470 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1e480 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1e490 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1e4a0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1e4b0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1e4c0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1e4d0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1e4e0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1e4f0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1e500 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1e510 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1e520 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1e530 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1e540 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1e550 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1e560 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1e570 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1e580 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1e590 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1e5a0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1e5b0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1e5c0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1e5d0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1e5e0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1e5f0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1e600 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1e610 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1e620 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1e630 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1e640 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1e650 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1e660 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1e680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1e6a0 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1e6b0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1e6c0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1e6d0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1e6e0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1e6f0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1e700 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1e710 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1e720 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e730 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e740 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e750 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e760 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1e770 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1e780 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1e790 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1e7a0 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1e7b0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1e7c0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1e7d0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1e7e0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1e7f0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1e800 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1e810 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e820 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1e830 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1e840 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1e850 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1e860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e890 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e8a0 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1e8b0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e8c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e8d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e8e0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1e8f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e900 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1e910 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1e920 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1e930 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1e940 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1e950 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1e960 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1e980 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1e990 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1e9a0 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1e9b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e9c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1e9d0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1e9e0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1e9f0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1ea00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1ea10 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1ea20 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1ea30 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1ea40 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1ea50 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1ea60 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1ea70 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1ea80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1ea90 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1eaa0 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1eab0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1eac0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1ead0 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1eae0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1eaf0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1eb00 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1eb10 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1eb20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1eb30 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1eb40 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1eb50 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1eb60 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1eb70 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1eb80 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1eb90 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1eba0 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1ebb0 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1ebc0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1ebd0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1ebe0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1ebf0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1ec00 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1ec10 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1ec20 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1ec30 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1ec40 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1ec50 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1ec60 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1ec70 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1ec80 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1ec90 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1eca0 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1ecb0 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1ecc0 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1ecd0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1ece0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1ecf0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1ed00 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1ed10 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1ed20 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1ed30 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1ed40 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1ed50 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1ed60 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1ed70 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1ed80 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1ed90 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1eda0 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1edb0 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1edc0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1edd0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1ede0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1edf0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1ee00 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1ee10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1ee20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ee30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1ee40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1ee50 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1ee60 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1ee70 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1ee80 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1ee90 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1eea0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1eeb0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1eec0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1eed0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1eee0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1eef0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1ef00 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1ef10 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1ef20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ef30 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1ef40 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1ef50 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1ef60 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1ef70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ef80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ef90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1efa0 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1efb0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1efc0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1efd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1efe0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1eff0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1f000 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1f010 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1f020 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1f030 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1f040 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1f050 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1f060 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1f070 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1f080 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1f090 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1f0a0 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1f0b0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1f0c0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1f0d0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1f0e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1f0f0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1f100 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1f110 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1f120 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1f130 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1f140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1f150 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1f160 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1f170 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1f180 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1f190 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1f1a0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1f1b0 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1f1c0 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1f1d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f1e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f1f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1f210 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1f220 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1f230 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1f240 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1f250 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1f260 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f280 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1f290 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1f2a0 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1f2b0 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1f2c0 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1f2d0 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1f2e0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1f2f0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1f300 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1f310 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1f320 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1f330 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1f340 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1f350 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1f360 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1f370 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1f380 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1f390 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f3a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f3b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f3c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1f3d0 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1f3e0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1f3f0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1f400 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1f410 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1f420 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1f430 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1f440 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1f450 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1f460 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1f470 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1f480 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1f490 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1f4a0 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1f4b0 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1f4c0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1f4d0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1f4e0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1f4f0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1f500 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1f510 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f520 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1f530 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1f540 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1f550 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1f560 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1f570 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1f580 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1f590 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1f5a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1f5b0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1f5c0 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1f5d0 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1f5e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1f600 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1f610 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1f620 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1f630 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1f640 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1f650 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1f660 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1f670 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1f680 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1f690 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1f6a0 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1f6b0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1f6c0 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1f6d0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1f6e0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1f6f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1f700 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1f710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f720 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f730 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f740 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1f750 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f760 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1f770 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1f780 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1f790 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f7a0 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1f7b0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1f7c0 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1f7d0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1f7e0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1f7f0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1f800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1f820 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1f830 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1f840 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1f850 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1f860 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1f870 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1f880 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1f890 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1f8a0 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1f8b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f8c0 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1f8d0 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1f8e0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1f8f0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1f900 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1f910 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1f920 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1f930 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f960 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1f970 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1f980 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f9a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1f9b0 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1f9c0 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1f9d0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1f9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f9f0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1fa00 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1fa10 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1fa20 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1fa30 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1fa40 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1fa50 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1fa60 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1fa70 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1fa80 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1fa90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1faa0 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1fab0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fac0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1fad0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1fae0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1faf0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1fb00 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1fb10 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1fb20 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1fb30 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1fb40 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1fb50 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1fb60 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1fb70 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1fb80 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1fb90 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1fba0 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1fbb0 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1fbc0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1fbd0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1fbe0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1fbf0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1fc00 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1fc10 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1fc20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1fc30 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1fc40 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1fc50 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1fc60 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1fc70 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1fc80 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1fc90 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1fca0 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1fcb0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1fcc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1fcd0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fce0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1fcf0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1fd00 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1fd10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1fd20 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1fd30 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1fd40 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1fd50 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1fd60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1fd70 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1fd80 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1fd90 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1fda0 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1fdb0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1fdc0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fdd0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1fde0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1fdf0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1fe00 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1fe10 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1fe20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fe30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fe40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1fe50 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1fe60 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1fe70 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1fe80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fe90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fea0 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1feb0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1fec0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1fed0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1fee0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1fef0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1ff00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ff10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1ff20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ff30 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1ff40 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1ff50 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ff60 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1ff70 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1ff80 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1ff90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1ffa0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1ffb0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1ffc0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1ffd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ffe0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1fff0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
20000 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
20010 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
20020 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
20030 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
20040 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
20050 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
20060 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
20070 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
20080 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
20090 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
200a0 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
200b0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
200c0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
200d0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
200e0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
200f0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
20100 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
20110 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
20120 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
20130 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
20140 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
20150 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
20160 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
20170 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
20180 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20190 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
201a0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
201b0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
201c0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
201d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
201e0 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
201f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20200 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
20210 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
20220 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
20230 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
20240 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
20250 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
20260 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
20270 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
20280 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20290 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
202a0 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
202b0 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
202c0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
202d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
202e0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
202f0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
20300 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
20310 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
20320 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
20330 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
20340 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
20350 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
20360 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
20370 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
20380 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
20390 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
203a0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
203b0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
203c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
203d0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
203e0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
203f0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
20400 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
20410 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
20420 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
20430 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
20440 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
20450 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
20460 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
20470 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
20480 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
20490 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
204a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
204b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
204c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
204d0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
204e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
204f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
20500 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
20510 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
20520 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
20530 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
20540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20550 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20560 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
20570 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
20580 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
20590 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
205a0 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
205b0 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
205c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
205d0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
205e0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
205f0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
20600 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
20610 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
20620 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
20630 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
20640 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
20650 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20660 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
20670 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
20680 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20690 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
206a0 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
206b0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
206c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
206d0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
206e0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
206f0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
20700 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
20710 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
20720 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
20730 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
20740 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
20760 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20770 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
20780 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
20790 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
207a0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
207b0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
207c0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
207d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
207e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
207f0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
20800 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
20810 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
20820 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20830 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
20840 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
20850 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
20860 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
20870 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
20880 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
20890 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
208a0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
208b0 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
208c0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
208d0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
208e0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
208f0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
20900 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
20910 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
20920 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
20930 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
20940 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
20950 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
20960 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
20970 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
20980 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
20990 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
209a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
209b0 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
209c0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
209d0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
209e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
209f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
20a00 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
20a10 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
20a20 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
20a30 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
20a40 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
20a50 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
20a60 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
20a70 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
20a80 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
20a90 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
20aa0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
20ab0 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
20ac0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
20ad0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
20ae0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
20af0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
20b00 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
20b10 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
20b20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
20b30 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
20b40 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
20b50 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
20b60 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
20b70 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
20b80 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
20b90 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
20ba0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
20bb0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20bc0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
20bd0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
20be0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
20bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
20c00 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
20c10 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
20c20 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
20c30 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
20c40 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
20c50 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
20c60 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
20c70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
20c80 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
20c90 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
20ca0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
20cb0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
20cc0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
20cd0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
20ce0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
20cf0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
20d00 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
20d10 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
20d20 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
20d30 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
20d40 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
20d50 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
20d60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
20d70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20d80 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
20d90 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
20da0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
20db0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20dc0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
20dd0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
20de0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
20df0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20e00 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
20e10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
20e20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20e30 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20e40 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
20e50 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
20e60 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
20e70 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
20e80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20e90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20ea0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20eb0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20ec0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20ed0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
20ee0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
20ef0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20f00 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
20f10 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
20f20 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
20f30 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
20f40 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20f50 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
20f60 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
20f70 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
20f80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20f90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20fa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20fb0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20fc0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
20fd0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
20fe0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
20ff0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
21000 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
21010 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
21020 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
21030 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
21040 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
21050 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21060 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
21070 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
21080 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
21090 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
210a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
210b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
210c0 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
210d0 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
210e0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
210f0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
21100 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
21110 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
21120 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
21130 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
21140 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
21150 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
21160 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
21170 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
21180 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
21190 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
211a0 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
211b0 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
211c0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
211d0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
211e0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
211f0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
21200 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
21210 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
21220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
21230 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
21240 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
21250 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
21260 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
21270 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
21280 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
21290 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
212a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
212b0 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
212c0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
212d0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
212e0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
212f0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
21300 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
21310 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
21320 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
21330 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
21340 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
21350 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
21360 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
21370 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
21380 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
21390 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
213a0 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
213b0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
213c0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
213d0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
213e0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
213f0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
21400 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
21410 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
21420 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
21430 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
21440 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
21450 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
21460 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
21470 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
21480 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
21490 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
214a0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
214b0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
214c0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
214d0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
214e0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
214f0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
21500 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
21510 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21520 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
21530 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
21540 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
21550 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
21560 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21570 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
21580 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
21590 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
215a0 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
215b0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
215c0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
215d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
215e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
215f0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
21600 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
21610 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
21620 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
21630 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
21640 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
21650 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
21660 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
21670 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
21680 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
21690 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
216a0 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
216b0 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
216c0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
216d0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
216e0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
216f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
21700 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
21710 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
21720 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
21730 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21740 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
21750 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
21760 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
21770 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
21780 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
21790 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
217a0 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
217b0 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
217c0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
217d0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
217e0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
217f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
21800 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
21810 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
21820 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
21830 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
21840 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
21850 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
21860 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
21870 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
21880 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
21890 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
218a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
218b0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
218c0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
218d0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
218e0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
218f0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
21900 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
21910 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
21920 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
21930 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
21940 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
21950 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21960 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
21970 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
21980 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
21990 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
219a0 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
219b0 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
219c0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
219d0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
219e0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
219f0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
21a00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21a10 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
21a20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
21a30 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
21a40 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
21a50 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
21a60 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21a70 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
21a80 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
21a90 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
21aa0 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
21ab0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21ac0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
21ad0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
21ae0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
21af0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
21b00 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
21b10 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
21b20 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
21b30 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
21b40 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
21b50 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
21b60 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
21b70 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
21b80 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21b90 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
21ba0 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
21bb0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21bc0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21bd0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21be0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
21bf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21c00 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
21c10 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
21c20 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
21c30 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
21c40 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
21c50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
21c60 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
21c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
21c80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
21c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21ca0 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
21cb0 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
21cc0 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
21cd0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
21ce0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
21cf0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
21d00 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
21d10 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
21d20 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
21d30 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
21d40 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
21d50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21d60 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21d70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21d80 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
21d90 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
21da0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21db0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
21dc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
21dd0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21de0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21df0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21e00 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
21e10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21e20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
21e30 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21e40 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
21e50 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
21e60 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21e70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21e80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21e90 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
21ea0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
21eb0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
21ec0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
21ed0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
21ee0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
21ef0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
21f00 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
21f10 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
21f20 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
21f30 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
21f40 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
21f50 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
21f60 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
21f70 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
21f80 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
21f90 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
21fa0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
21fb0 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
21fc0 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
21fd0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21fe0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
21ff0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
22000 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
22010 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
22020 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
22030 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
22040 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
22050 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
22060 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
22070 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
22080 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
22090 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
220a0 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
220b0 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
220c0 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
220d0 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
220e0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
220f0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
22100 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
22110 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
22120 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
22130 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
22140 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
22150 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
22160 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
22170 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
22180 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
22190 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
221a0 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
221b0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
221c0 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
221d0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
221e0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
221f0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
22200 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
22210 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
22220 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
22230 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
22240 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
22250 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
22260 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
22270 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
22280 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
22290 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
222a0 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
222b0 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
222c0 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
222d0 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
222e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
222f0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
22300 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
22310 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
22320 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
22330 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
22340 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
22350 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
22360 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
22370 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
22380 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
22390 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
223a0 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
223b0 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
223c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
223d0 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
223e0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
223f0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
22400 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
22410 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
22420 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
22430 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
22440 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
22450 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
22460 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
22470 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
22480 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
22490 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
224a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
224b0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
224c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
224d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
224e0 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
224f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
22500 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
22510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22530 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
22540 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
22550 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
22560 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
22570 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
22580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
225a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
225b0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
225c0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
225d0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
225e0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
225f0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
22600 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
22610 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c  }.      btreeRel
22620 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
22630 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  es(p);.    }.   
22640 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22650 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
22660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22670 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
22680 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
22690 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
226a0 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
226b0 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
226c0 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
226d0 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
226e0 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
226f0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
22700 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
22710 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
22720 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
22730 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
22740 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
22750 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
22760 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
22770 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
22780 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
22790 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
227a0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
227b0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
227c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
227d0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
227e0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
227f0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
22800 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
22810 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
22820 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
22830 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
22840 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
22850 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
22860 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
22870 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
22880 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
22890 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
228a0 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
228b0 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
228c0 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
228d0 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
228e0 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
228f0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
22900 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
22910 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
22920 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
22930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
22940 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
22950 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
22960 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
22970 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
22980 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
22990 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
229a0 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
229b0 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
229c0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
229d0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
229e0 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
229f0 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
22a00 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
22a10 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
22a20 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
22a30 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
22a40 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
22a50 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
22a60 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
22a70 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
22a80 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22a90 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
22aa0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
22ab0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
22ac0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22ad0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
22ae0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
22af0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
22b00 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
22b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22b20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
22b30 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
22b40 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
22b50 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
22b60 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
22b70 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
22b80 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
22b90 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
22ba0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
22bb0 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
22bc0 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
22bd0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
22be0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
22bf0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
22c00 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
22c10 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
22c20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
22c30 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
22c40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22c50 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
22c60 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
22c70 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
22c80 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
22c90 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
22ca0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22cb0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
22cc0 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
22cd0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
22ce0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
22cf0 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  One(pPage1);.   
22d00 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
22d10 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
22d20 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20  (pBt, 1)==0 );. 
22d30 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
22d40 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
22d50 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
22d60 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
22d70 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
22d80 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
22d90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22da0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22db0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22dc0 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
22dd0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
22de0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
22df0 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c  tion can be roll
22e00 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
22e10 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
22e20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
22e30 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
22e40 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
22e50 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
22e60 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
22e70 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
22e80 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
22e90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22ea0 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
22eb0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
22ec0 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
22ed0 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
22ee0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
22ef0 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
22f00 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
22f10 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
22f20 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
22f30 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
22f40 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
22f50 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
22f60 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
22f70 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
22f80 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
22f90 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
22fa0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
22fb0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
22fc0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
22fd0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
22fe0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
22ff0 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
23000 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
23010 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
23020 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
23030 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
23040 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
23050 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23060 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
23070 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
23080 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
23090 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
230a0 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
230b0 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
230c0 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
230d0 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
230e0 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
230f0 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
23100 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
23110 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
23120 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
23130 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
23140 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
23150 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
23160 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
23170 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
23180 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
23190 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
231a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
231b0 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
231c0 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
231d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
231e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
231f0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
23200 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
23210 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
23220 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
23230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
23240 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
23250 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
23260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
23270 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
23280 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
23290 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
232a0 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
232b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
232c0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
232d0 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
232e0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
232f0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
23300 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
23310 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
23320 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
23330 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
23340 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
23350 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
23360 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
23370 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
23380 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
23390 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
233a0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
233b0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
233c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
233d0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
233e0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
233f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23400 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
23410 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
23420 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
23430 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
23440 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23450 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
23460 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
23470 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
23480 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
23490 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
234a0 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
234b0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
234c0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
234d0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
234e0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
234f0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
23500 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
23510 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
23520 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
23530 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
23540 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
23550 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
23560 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
23570 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
23580 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
23590 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
235a0 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
235b0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
235c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
235d0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
235e0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
235f0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
23600 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
23610 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
23620 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
23630 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
23640 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
23650 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
23660 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
23670 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
23680 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23690 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
236a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
236b0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
236c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
236d0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
236e0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
236f0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
23700 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
23710 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
23720 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
23730 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
23740 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
23750 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
23760 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
23770 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
23780 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
23790 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
237a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
237b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
237c0 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
237d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
237e0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
237f0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
23800 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
23810 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23820 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23830 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
23840 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
23850 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
23860 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23870 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23880 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
23890 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
238a0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
238b0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
238c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
238d0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
238e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
238f0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
23900 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
23910 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
23920 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
23930 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
23940 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
23950 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
23960 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
23970 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
23980 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
23990 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
239a0 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
239b0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
239c0 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
239d0 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
239e0 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
239f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
23a00 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
23a10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
23a20 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
23a30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23a40 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
23a50 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
23a60 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
23a70 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
23a80 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
23a90 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
23aa0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
23ab0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
23ac0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
23ad0 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
23ae0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
23af0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
23b00 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
23b10 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
23b20 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
23b30 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
23b40 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
23b50 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
23b60 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
23b70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
23b80 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  ** If the BTREE_
23b90 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46  WRCSR bit of wrF
23ba0 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
23bb0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
23bc0 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65  n only.** be use
23bd0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20  d for reading.  
23be0 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
23bf0 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  SR bit is set, t
23c00 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hen the cursor.*
23c10 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  * can be used fo
23c20 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
23c30 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
23c40 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
23c50 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20   writing.** are 
23c60 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
23c70 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
23c80 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
23c90 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a   met in order.**
23ca0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20   for writing to 
23cb0 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
23cc0 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
23cd0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
23ce0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
23cf0 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54  ag containing BT
23d00 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20  REE_WRCSR.**.** 
23d10 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
23d20 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
23d30 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
23d40 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
23d50 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
23d60 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
23d70 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
23d80 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
23d90 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
23da0 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
23db0 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
23dc0 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
23dd0 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
23de0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
23df0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
23e00 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
23e10 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
23e20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
23e30 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
23e40 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
23e50 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
23e60 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
23e70 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
23e80 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
23e90 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
23ea0 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
23eb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23ec0 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46  *.** The BTREE_F
23ed0 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20  ORDELETE bit of 
23ee0 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f  wrFlag may optio
23ef0 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20  nally be set if 
23f00 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69  BTREE_WRCSR.** i
23f10 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45  s set.  If FORDE
23f20 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61  LETE is set, tha
23f30 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  t is a hint to t
23f40 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
23f50 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63  n that.** this c
23f60 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  ursor will only 
23f70 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20  be used to seek 
23f80 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e  to and delete en
23f90 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65  tries of an inde
23fa0 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  x.** as part of 
23fb0 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20  a larger DELETE 
23fc0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
23fd0 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69  FORDELETE hint i
23fe0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a  s not used by.**
23ff0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
24000 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20  tion.  But in a 
24010 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74  hypothetical alt
24020 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65  ernative storage
24030 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77   engine .** in w
24040 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69  hich index entri
24050 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
24060 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
24070 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  n corresponding 
24080 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72  table.** rows ar
24090 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46  e deleted, the F
240a0 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73  ORDELETE flag is
240b0 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c   a hint that all
240c0 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45   SEEK and DELETE
240d0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  .** operations o
240e0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61  n this cursor ca
240f0 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20  n be no-ops and 
24100 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69  all READ operati
24110 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75  ons can .** retu
24120 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32  rn a null row (2
24130 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30  -bytes: 0x01 0x0
24140 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  0)..**.** No che
24150 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
24160 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
24170 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
24180 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
24190 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
241a0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
241b0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
241c0 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
241d0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
241e0 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
241f0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
24200 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
24210 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
24220 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
24230 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
24240 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
24250 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
24260 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
24270 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
24280 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
24290 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
242c0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
242d0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
242e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242f0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
24300 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
24310 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
24320 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
24330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24340 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
24350 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
24360 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
24370 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
24380 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
24390 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
243a0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
243b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243d0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
243e0 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
243f0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
24400 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24420 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
24430 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
24440 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24460 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
24470 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
24480 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
24490 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
244a0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
244b0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
244c0 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  0 .       || wrF
244d0 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52  lag==BTREE_WRCSR
244e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
244f0 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52  ag==(BTREE_WRCSR
24500 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45  |BTREE_FORDELETE
24510 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ) .  );..  /* Th
24520 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
24530 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
24540 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
24550 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
24560 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
24570 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
24580 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24590 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
245a0 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
245b0 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
245c0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
245d0 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
245e0 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
245f0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
24600 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
24610 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
24620 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
24630 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
24640 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31  !=0, (wrFlag?2:1
24650 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  )) );.  assert( 
24660 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
24670 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
24680 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
24690 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
246a0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
246b0 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
246c0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
246d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
246e0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
246f0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
24700 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
24710 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
24720 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
24730 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
24740 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
24750 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
24760 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
24770 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
24780 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
24790 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
247a0 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
247b0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
247c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
247d0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
247e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
247f0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
24800 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
24810 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
24820 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
24830 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
24840 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
24850 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
24860 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
24870 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
24880 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
24890 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
248a0 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
248b0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
248c0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
248d0 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
248e0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
248f0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
24900 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
24910 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
24920 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
24930 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
24940 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
24950 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
24960 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
24970 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
24980 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
24990 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
249a0 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
249b0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
249c0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
249d0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
249e0 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
249f0 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
24a00 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
24a10 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
24a20 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
24a30 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
24a40 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
24a50 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
24a60 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
24a70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
24a80 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
24a90 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
24aa0 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
24ab0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
24ac0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
24ad0 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
24ae0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
24af0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
24b00 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
24b10 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
24b20 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24b30 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
24b40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
24b50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
24b60 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
24b70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
24ba0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
24bb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bd0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
24be0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
24bf0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
24c00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
24c30 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
24c40 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
24c50 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c70 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
24c80 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
24c90 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24cc0 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
24cd0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
24ce0 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
24cf0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
24d00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24d10 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
24d20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24d30 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
24d40 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
24d50 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
24d60 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
24d70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
24d80 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
24d90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24da0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
24db0 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
24dc0 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
24dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
24de0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
24df0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
24e00 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
24e10 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
24e20 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
24e30 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
24e40 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
24e50 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
24e60 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
24e70 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
24e80 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
24e90 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
24ea0 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
24eb0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
24ec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24ed0 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
24ee0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
24ef0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
24f00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
24f10 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
24f20 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
24f30 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
24f40 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
24f50 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
24f60 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
24f70 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
24f80 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
24f90 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
24fa0 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
24fb0 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
24fc0 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
24fd0 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
24fe0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
24ff0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
25000 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
25010 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
25020 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
25030 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
25040 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
25050 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
25060 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
25070 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
25080 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
25090 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
250a0 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55 52 53  BtCursor, BTCURS
250b0 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54 29  OR_FIRST_UNINIT)
250c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
250d0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
250e0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
250f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25100 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
25110 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
25120 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
25130 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25140 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
25150 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25160 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
25170 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
25180 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
25190 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
251a0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
251b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
251c0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
251d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
251e0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
251f0 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
25200 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
25210 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
25220 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
25230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43  }else{.      BtC
25240 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70  ursor *pPrev = p
25250 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20  Bt->pCursor;.   
25260 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
25270 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  f( pPrev->pNext=
25280 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =pCur ){.       
25290 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20     pPrev->pNext 
252a0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
252b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
252c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
252d0 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d    pPrev = pPrev-
252e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77  >pNext;.      }w
252f0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72  hile( ALWAYS(pPr
25300 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ev) );.    }.   
25310 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
25320 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
25330 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  );.    unlockBtr
25340 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
25350 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25360 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
25370 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  w);.    sqlite3_
25380 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
25390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
253a0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
253b0 0a 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65  .    pCur->pBtre
253c0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
253d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
253e0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
253f0 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
25400 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
25410 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
25420 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
25430 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
25440 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
25450 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
25460 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
25470 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
25480 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
25490 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
254a0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
254b0 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
254c0 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
254d0 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
254e0 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
254f0 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
25500 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
25510 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
25520 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 65  .  static int ce
25530 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c  llInfoEqual(Cell
25540 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66  Info *a, CellInf
25550 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20 61  o *b){.    if( a
25560 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20  ->nKey!=b->nKey 
25570 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25580 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21  if( a->pPayload!
25590 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20 72  =b->pPayload ) r
255a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
255b0 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d   a->nPayload!=b-
255c0 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75  >nPayload ) retu
255d0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
255e0 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63  >nLocal!=b->nLoc
255f0 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
25600 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21     if( a->nSize!
25610 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74 75  =b->nSize ) retu
25620 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 0;.    return
25630 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63   1;.  }.  static
25640 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
25650 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
25660 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
25670 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
25680 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
25690 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
256a0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
256b0 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
256c0 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  r->ix, &info);. 
256d0 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
256e0 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66  PT_DB || cellInf
256f0 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70  oEqual(&info, &p
25700 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20  Cur->info) );.  
25710 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
25720 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
25730 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  (x).#endif.stati
25740 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
25750 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  E void getCellIn
25760 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
25770 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
25780 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
25790 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
257a0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
257b0 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65  dNKey;.    btree
257c0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
257d0 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26  pPage,pCur->ix,&
257e0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
257f0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
25800 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
25810 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
25820 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
25830 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
25840 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
25850 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
25860 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
25870 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
25880 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
25890 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
258a0 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
258b0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
258c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
258d0 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
258e0 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
258f0 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
25900 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
25910 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
25920 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
25930 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
25940 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
25950 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
25960 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
25970 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
25980 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25990 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
259a0 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
259b0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
259c0 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
259d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
259e0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
259f0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
25a00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25a10 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
25a20 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
25a30 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
25a40 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
25a50 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
25a60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25a70 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
25a80 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
25a90 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
25aa0 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
25ab0 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
25ac0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
25ad0 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
25ae0 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
25af0 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
25b00 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
25b10 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
25b20 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
25b30 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
25b40 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25b50 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25b60 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25b80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25b90 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
25ba0 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
25bb0 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
25bc0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
25bd0 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
25be0 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  .nKey;.}..#ifdef
25bf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
25c00 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f  FFSET_SQL_FUNC./
25c10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25c20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
25c30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
25c40 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
25c50 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f  he.** payload to
25c60 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
25c70 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  r is pointing..*
25c80 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
25c90 65 65 4f 66 66 73 65 74 28 42 74 43 75 72 73 6f  eeOffset(BtCurso
25ca0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
25cb0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25cc0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25cd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25ce0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25cf0 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
25d00 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
25d10 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e 70  urn (i64)pCur->p
25d20 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28 69  Bt->pageSize*((i
25d30 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  64)pCur->pPage->
25d40 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20  pgno - 1) +.    
25d50 20 20 20 20 20 28 69 36 34 29 28 70 43 75 72 2d       (i64)(pCur-
25d60 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  >info.pPayload -
25d70 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44   pCur->pPage->aD
25d80 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ata);.}.#endif /
25d90 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
25da0 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20  OFFSET_SQL_FUNC 
25db0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
25dc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
25dd0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20  ytes of payload 
25de0 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
25df0 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75  at pCur is.** cu
25e00 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
25e10 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20   to.  For table 
25e20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c  btrees, this wil
25e30 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a  l be the amount.
25e40 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72  ** of data.  For
25e50 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74   index btrees, t
25e60 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
25e70 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e  size of the key.
25e80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
25e90 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
25ea0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
25eb0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
25ec0 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
25ed0 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
25ee0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
25ef0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
25f00 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
25f10 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
25f20 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
25f30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25f40 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  LID..*/.u32 sqli
25f50 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
25f60 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
25f70 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
25f80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25f90 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25fa0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
25fb0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25fc0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
25fd0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
25fe0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
25ff0 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ad;.}../*.** Giv
26000 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
26010 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
26020 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
26030 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
26040 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
26050 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
26060 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
26070 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
26080 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
26090 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
260a0 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
260b0 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
260c0 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
260d0 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
260e0 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
260f0 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
26100 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
26110 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
26120 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26130 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
26140 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
26150 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
26160 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
26170 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
26180 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
26190 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
261a0 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
261b0 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
261c0 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
261d0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
261e0 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
261f0 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
26200 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
26210 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
26220 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
26230 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
26240 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
26250 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
26260 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
26270 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
26280 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
26290 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
262a0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
262b0 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
262c0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
262d0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
262e0 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
262f0 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
26300 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
26310 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
26320 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
26330 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
26340 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
26350 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
26360 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
26370 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
26380 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
26390 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
263a0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
263b0 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
263c0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
263d0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
263e0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
263f0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
26400 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
26410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
26420 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
26430 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
26440 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
26450 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
26460 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
26470 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
26480 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
26490 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
264a0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
264b0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
264c0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
264d0 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
264e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
264f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
26500 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
26510 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
26520 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
26530 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
26540 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
26550 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26560 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
26570 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
26580 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
26590 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
265a0 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
265b0 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
265c0 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
265d0 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
265e0 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
265f0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
26600 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
26610 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
26620 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
26630 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
26640 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
26650 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
26660 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
26670 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
26680 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
26690 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
266a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
266b0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
266c0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
266d0 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
266e0 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
266f0 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
26700 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
26710 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
26720 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
26730 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
26740 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
26750 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
26760 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
26770 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
26780 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
26790 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
267a0 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
267b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
267c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
267d0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
267e0 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
267f0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
26800 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
26810 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26820 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
26830 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
26840 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
26850 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
26860 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
26870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26880 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
26890 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
268a0 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
268b0 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
268c0 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
268d0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
268e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
268f0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
26900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26910 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
26920 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
26930 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
26940 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
26950 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
26960 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
26970 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
26980 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
26990 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
269a0 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
269b0 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
269c0 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
269d0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
269e0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
269f0 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
26a00 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
26a10 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
26a20 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
26a30 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
26a40 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
26a50 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
26a60 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
26a70 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
26a80 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
26a90 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
26aa0 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
26ab0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
26ac0 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
26ad0 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
26ae0 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
26af0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
26b00 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
26b10 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
26b20 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
26b30 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
26b40 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
26b50 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
26b60 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26b70 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
26b80 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
26b90 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
26ba0 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
26bb0 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
26bc0 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
26bd0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
26be0 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
26bf0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
26c00 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
26c10 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
26c20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
26c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26c40 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
26c50 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
26c60 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
26c70 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
26c80 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
26c90 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
26ca0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
26cb0 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
26cc0 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
26cd0 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
26ce0 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
26cf0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
26d00 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
26d10 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
26d20 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
26d30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26d40 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
26d50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26d70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
26d80 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
26d90 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
26da0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
26db0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
26dc0 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
26dd0 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
26de0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
26df0 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
26e00 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
26e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26e20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
26e30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
26e40 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
26e50 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
26e60 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
26e70 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
26e80 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
26e90 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
26ea0 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
26eb0 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
26ec0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
26ed0 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
26ee0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
26ef0 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
26f00 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
26f10 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
26f20 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
26f30 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
26f40 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
26f50 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
26f60 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
26f70 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
26f80 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
26f90 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
26fa0 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
26fb0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
26fc0 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
26fd0 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
26fe0 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
26ff0 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
27000 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
27010 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
27020 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
27030 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
27040 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
27050 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  t cursor entry u
27060 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
27070 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a  overflow pages.*
27080 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
27090 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
270a0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
270b0 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68  y populate.** th
270c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
270d0 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
270e0 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
270f0 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
27100 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
27110 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
27120 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
27130 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
27140 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
27150 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
27160 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
27170 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
27180 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
27190 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69   it must be.** i
271a0 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
271b0 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
271c0 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
271d0 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
271e0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
271f0 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
27200 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
27210 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
27220 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
27230 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
27240 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
27250 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
27260 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27270 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
27280 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
27290 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
272a0 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
272b0 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
272c0 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
272d0 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
272e0 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
272f0 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
27300 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
27310 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
27320 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
27330 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
27340 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
27350 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
27360 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
27370 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
27380 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
27390 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
273a0 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
273b0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
273c0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
273d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
273e0 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
273f0 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
27400 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
27410 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
27420 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
27430 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
27440 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
27450 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27460 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
27470 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27480 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
27490 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
274a0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
274b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
274c0 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
274d0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
274e0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
274f0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27510 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
27520 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
27530 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
27540 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
27550 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64  _READ.  unsigned
27560 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42   char * const pB
27570 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20  ufStart = pBuf; 
27580 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
27590 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66  original out buf
275a0 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  fer */.#endif.. 
275b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
275c0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d  ;.  assert( eOp=
275d0 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a  =0 || eOp==1 );.
275e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
275f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27600 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
27610 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
27620 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
27630 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
27640 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
27650 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
27660 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
27670 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
27680 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28  yload;.  assert(
27690 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
276a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
276b0 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad );..  assert(
276c0 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67   aPayload > pPag
276d0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66  e->aData );.  if
276e0 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61  ( (uptr)(aPayloa
276f0 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d - pPage->aData
27700 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  ) > (pBt->usable
27710 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66  Size - pCur->inf
27720 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  o.nLocal) ){.   
27730 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
27740 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
27750 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
27760 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
27770 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f  .  The.    ** co
27780 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20  nditional above 
27790 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a  is really:.    *
277a0 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70  *    &aPayload[p
277b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
277c0 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
277d0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
277e0 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73  e].    ** but is
277f0 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73   recast into its
27800 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f   current form to
27810 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f   avoid integer o
27820 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73  verflow problems
27830 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
27840 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27850 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
27860 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
27870 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
27880 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
27890 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
278a0 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
278b0 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
278c0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
278d0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
278e0 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
278f0 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
27900 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
27910 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
27920 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
27930 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
27940 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
27950 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
27960 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
27970 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
27980 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
27990 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
279a0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
279b0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
279c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
279d0 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d  .  }...  if( rc=
279e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
279f0 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
27a00 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
27a10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
27a20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
27a30 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
27a40 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
27a50 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
27a60 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
27a70 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
27a80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
27a90 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
27aa0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
27ab0 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
27ac0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
27ad0 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
27ae0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
27af0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
27b00 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
27b10 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
27b20 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
27b30 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
27b40 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
27b50 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
27b60 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
27b70 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
27b80 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
27b90 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
27ba0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
27bb0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
27bc0 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
27bd0 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
27be0 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
27bf0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
27c00 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
27c10 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
27c20 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
27c30 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
27c40 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
27c50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
27c60 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
27c70 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
27c80 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
27c90 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
27ca0 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20 7c  flow==0.       |
27cb0 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69 7a  | nOvfl*(int)siz
27cc0 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c 69  eof(Pgno) > sqli
27cd0 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 43  te3MallocSize(pC
27ce0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a 20  ur->aOverflow). 
27cf0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27d00 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67  Pgno *aNew = (Pg
27d10 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  no*)sqlite3Reall
27d20 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
27d30 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
27d40 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28   nOvfl*2*sizeof(
27d50 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
27d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
27d70 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
27d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d90 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27db0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
27dc0 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
27dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27de0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
27df0 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
27e00 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
27e10 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  o));.      pCur-
27e20 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
27e30 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
27e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
27e50 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
27e60 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27e70 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
27e80 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
27e90 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
27ea0 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
27eb0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
27ec0 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
27ed0 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
27ee0 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   to it..      */
27ef0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
27f00 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
27f10 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
27f20 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f         iIdx = (o
27f30 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
27f40 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67  .        nextPag
27f50 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
27f60 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
27f70 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
27f80 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
27f90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
27fa0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
27fb0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27fc0 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   );.    while( n
27fd0 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
27fe0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
27ff0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
28000 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
28010 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
28020 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28030 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
28040 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
28050 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
28060 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
28070 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
28080 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
28090 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
280a0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
280b0 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20  nextPage;..     
280c0 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
280d0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
280e0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
280f0 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
28100 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
28110 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
28120 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
28130 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
28140 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
28150 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
28160 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
28170 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
28180 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
28190 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
281a0 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
281b0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
281c0 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
281d0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
281e0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
281f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
28200 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
28210 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28220 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
28230 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
28240 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
28250 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
28260 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
28270 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
28280 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28290 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
282a0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
282b0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
282c0 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
282d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
282e0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
282f0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
28300 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
28310 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28320 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
28330 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
28340 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
28350 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
28360 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
28370 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
28380 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
28390 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
283a0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
283b0 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
283c0 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
283d0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
283e0 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
283f0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
28400 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
28410 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
28420 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
28430 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
28440 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
28450 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
28460 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
28470 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
28480 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
28490 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
284a0 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
284b0 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
284c0 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
284d0 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
284e0 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
284f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
28500 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
28510 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
28520 20 20 20 33 29 20 74 68 65 72 65 20 61 72 65 20     3) there are 
28530 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73 20 69  no dirty pages i
28540 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
28550 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
28560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
28570 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
28580 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
28590 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  ) the page is no
285a0 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c  t in the WAL fil
285b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  e.        **   6
285c0 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
285d0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
285e0 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
285f0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
28600 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
28610 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
28620 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
28630 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
28640 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
28650 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
28660 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
28670 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
28680 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
28690 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
286a0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
286b0 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
286c0 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
286d0 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
286e0 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
286f0 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
28700 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28730 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
28740 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
28780 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  /.         && sq
28790 6c 69 74 65 33 50 61 67 65 72 44 69 72 65 63 74  lite3PagerDirect
287a0 52 65 61 64 4f 6b 28 70 42 74 2d 3e 70 50 61 67  ReadOk(pBt->pPag
287b0 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20  er, nextPage)   
287c0 20 2f 2a 20 28 33 2c 34 2c 35 29 20 2a 2f 0a 20   /* (3,4,5) */. 
287d0 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66          && &pBuf
287e0 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20  [-4]>=pBufStart 
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28810 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
28820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
28830 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
28840 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
28850 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
28860 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
28870 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
28880 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
28890 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
288a0 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65    assert( aWrite
288b0 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20  >=pBufStart );  
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f         /* due to
288e0 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
288f0 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
28900 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
28910 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28920 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
28930 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
28940 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
28950 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
28960 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
28970 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
28980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
28990 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
289a0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
289b0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
289c0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
289d0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
289e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
289f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
28a00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
28a10 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
28a20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28a30 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f  (eOp==0 ? PAGER_
28a40 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
28a50 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
28a60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
28a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28a80 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
28a90 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
28aa0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
28ab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
28ac0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
28ad0 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
28ae0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
28af0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
28b00 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
28b10 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
28b20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28b30 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
28b40 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
28b50 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
28b60 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
28b70 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28b80 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
28b90 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d          if( amt=
28ba0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
28bb0 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
28bc0 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  a;.      }.     
28bd0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
28be0 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20  .      iIdx++;. 
28bf0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
28c00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28c10 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a   amt>0 ){.    /*
28c20 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   Overflow chain 
28c30 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79  ends prematurely
28c40 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
28c50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
28c60 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
28c70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28c80 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
28c90 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f  f the payload fo
28ca0 72 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69  r the row at whi
28cb0 63 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ch that cursor p
28cc0 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Cur is currently
28cd0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22  .** pointing.  "
28ce0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
28cf0 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69  be transferred i
28d00 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
28d10 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
28d20 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
28d30 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20  .**.** pCur can 
28d40 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  be pointing to e
28d50 69 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72  ither a table or
28d60 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
28d70 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67  ..** If pointing
28d80 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65   to a table btre
28d90 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  e, then the cont
28da0 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72  ent section is r
28db0 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72  ead.  If.** pCur
28dc0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
28dd0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
28de0 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63  then the key sec
28df0 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a  tion is read..**
28e00 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42  .** For sqlite3B
28e10 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74  treePayload(), t
28e20 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
28e30 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20  nsure that pCur 
28e40 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  is pointing.** t
28e50 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e  o a valid row in
28e60 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72   the table.  For
28e70 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28e80 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74  loadChecked(), t
28e90 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67  he.** cursor mig
28ea0 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72  ht be invalid or
28eb0 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
28ec0 65 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72  e restored befor
28ed0 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a  e being read..**
28ee0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
28ef0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
28f00 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
28f10 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
28f20 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
28f30 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
28f40 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
28f50 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
28f60 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
28f70 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
28f80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
28f90 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a  yload(BtCursor *
28fa0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
28fb0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
28fc0 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
28fd0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28fe0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28ff0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29000 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29020 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
29030 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
29040 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29050 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
29060 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
29070 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
29080 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
29090 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
290a0 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
290b0 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e  *.** This varian
290c0 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  t of sqlite3Btre
290d0 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73  ePayload() works
290e0 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72   even if the cur
290f0 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69  sor has not.** i
29100 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c  n the CURSOR_VAL
29110 49 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73  ID state.  It is
29120 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68   only used by th
29130 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  e sqlite3_blob_r
29140 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  ead().** interfa
29150 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ce..*/.#ifndef S
29160 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
29170 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54  LOB.static SQLIT
29180 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61  E_NOINLINE int a
29190 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
291a0 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
291b0 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66  *pCur,.  u32 off
291c0 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a  set,.  u32 amt,.
291d0 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a    void *pBuf.){.
291e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28    int rc;.  if (
291f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29200 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
29210 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29220 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20  TE_ABORT;.  }.  
29230 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29240 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29250 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
29260 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
29270 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72  ition(pCur);.  r
29280 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20  eturn rc ? rc : 
29290 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
292a0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
292b0 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74   pBuf, 0);.}.int
292c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
292d0 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75  loadChecked(BtCu
292e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
292f0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
29300 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
29310 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
29320 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
29330 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75  {.    assert( cu
29340 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
29350 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65  (pCur) );.    re
29360 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
29370 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
29380 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
29390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
293a0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
293b0 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f  dChecked(pCur, o
293c0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
293d0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
293e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
293f0 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
29400 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
29410 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
29420 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
29430 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
29440 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
29450 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
29460 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
29470 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
29480 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
29490 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73   if index btrees
294a0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
294b0 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64  =0) and is the d
294c0 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65  ata for.** table
294d0 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
294e0 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20  intKey==1). The 
294f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
29500 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  of available.** 
29510 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
29520 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  ten into *pAmt. 
29530 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
29540 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  en the value.** 
29550 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
29560 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69  t be a valid poi
29570 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
29580 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
29590 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
295a0 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
295b0 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
295c0 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
295d0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
295e0 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
295f0 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
29600 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
29610 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
29620 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
29630 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
29640 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
29650 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
29660 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
29670 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
29680 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
29690 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
296a0 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
296b0 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
296c0 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
296d0 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
296e0 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
296f0 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
29700 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
29710 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
29720 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
29730 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
29740 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
29750 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
29760 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
29770 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
29780 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
29790 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
297a0 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
297b0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
297c0 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64  tatic const void
297d0 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
297e0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
297f0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
29800 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
29810 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
29820 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20  */.  u32 *pAmt  
29830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
29840 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
29850 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
29860 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
29870 74 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28  t amt;.  assert(
29880 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
29890 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
298a0 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61 73  ur->pPage);.  as
298b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
298c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
298d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
298e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
298f0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
29900 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
29910 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
29920 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29940 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67  r->ix<pCur->pPag
29950 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
29960 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
29970 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
29980 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
29990 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
299a0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
299b0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
299c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
299d0 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72  fo.pPayload<pCur
299e0 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ->pPage->aDataEn
299f0 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b  d ||CORRUPT_DB);
29a00 0a 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69  .  amt = pCur->i
29a10 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66  nfo.nLocal;.  if
29a20 28 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75 72  ( amt>(int)(pCur
29a30 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ->pPage->aDataEn
29a40 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d - pCur->info.p
29a50 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20  Payload) ){.    
29a60 2f 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f 20  /* There is too 
29a70 6c 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e 20  little space on 
29a80 74 68 65 20 70 61 67 65 20 66 6f 72 20 74 68 65  the page for the
29a90 20 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e 74   expected amount
29aa0 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c  .    ** of local
29ab0 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62 61   content. Databa
29ac0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
29ad0 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  pt. */.    asser
29ae0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  t( CORRUPT_DB );
29af0 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28 30  .    amt = MAX(0
29b00 2c 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50  , (int)(pCur->pP
29b10 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  age->aDataEnd - 
29b20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
29b30 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41  oad));.  }.  *pA
29b40 6d 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20  mt = (u32)amt;. 
29b50 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70   return (void*)p
29b60 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29b70 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
29b80 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
29b90 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
29ba0 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
29bb0 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
29bc0 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
29bd0 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
29be0 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
29bf0 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
29c00 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
29c10 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
29c20 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
29c30 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
29c40 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
29c50 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
29c60 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
29c70 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
29c80 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
29c90 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
29ca0 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
29cb0 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
29cc0 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
29cd0 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
29ce0 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
29cf0 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
29d00 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
29d10 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
29d20 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
29d30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
29d40 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
29d50 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
29d60 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
29d70 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
29d80 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
29d90 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
29da0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
29db0 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
29dc0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
29dd0 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28  reePayloadFetch(
29de0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29df0 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
29e00 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
29e10 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
29e20 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
29e30 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
29e40 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
29e50 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
29e60 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
29e70 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
29e80 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
29e90 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a   to move to..**.
29ea0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29eb0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
29ec0 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70  CORRUPT if the p
29ed0 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
29ee0 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65   field of.** the
29ef0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
29f00 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
29f10 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  he flags field o
29f20 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e  f the parent (i.
29f30 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b  e..** if an intk
29f40 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20  ey page appears 
29f50 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74  to be the parent
29f60 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   of a non-intkey
29f70 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63   page, or.** vic
29f80 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61  e-versa)..*/.sta
29f90 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
29fa0 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
29fb0 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
29fc0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
29fd0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
29fe0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29ff0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2a000 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2a010 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a020 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2a030 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2a040 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
2a050 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
2a060 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
2a070 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2a080 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
2a090 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
2a0a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a0b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2a0c0 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  T;.  }.  pCur->i
2a0d0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2a0e0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2a0f0 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2a100 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2a110 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  fl);.  pCur->aiI
2a120 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2a130 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43  = pCur->ix;.  pC
2a140 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a150 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e  >iPage] = pCur->
2a160 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69  pPage;.  pCur->i
2a170 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
2a180 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  Page++;.  return
2a190 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2a1a0 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
2a1b0 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
2a1c0 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
2a1d0 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65  Flags);.}..#ifde
2a1e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2a1f0 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
2a200 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
2a210 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
2a220 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
2a230 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
2a240 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2a250 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2a260 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
2a270 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
2a280 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
2a290 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
2a2a0 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
2a2b0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
2a2c0 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
2a2d0 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
2a2e0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
2a2f0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
2a300 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
2a310 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2a320 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2a330 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2a340 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
2a350 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20   iChild){.  if( 
2a360 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
2a370 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e  urn;  /* The con
2a380 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62  ditions tested b
2a390 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62  elow might not b
2a3a0 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20  e true.         
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3c0 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
2a3d0 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  pt database */. 
2a3e0 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
2a3f0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
2a400 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
2a410 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2a420 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2a430 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2a440 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2a450 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
2a460 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
2a470 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2a480 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2a490 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
2a4a0 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
2a4b0 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
2a4c0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2a4d0 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
2a4e0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2a4f0 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
2a500 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
2a510 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
2a520 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
2a530 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
2a540 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
2a550 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
2a560 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
2a570 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
2a580 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
2a590 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
2a5a0 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
2a5b0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
2a5c0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
2a5d0 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
2a5e0 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
2a5f0 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
2a600 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
2a610 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2a620 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74  *pLeaf;.  assert
2a630 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a640 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a650 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a660 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a670 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2a680 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
2a690 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a6a0 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
2a6b0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
2a6c0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
2a6d0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2a6e0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2a6f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2a700 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67   .    pCur->pPag
2a710 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  e->pgno.  );.  t
2a720 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
2a730 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2a740 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
2a750 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2a760 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43  ]->nCell );.  pC
2a770 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2a780 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2a790 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2a7a0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2a7b0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
2a7c0 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  ->ix = pCur->aiI
2a7d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2a7e0 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75  ];.  pLeaf = pCu
2a7f0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72  r->pPage;.  pCur
2a800 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  ->pPage = pCur->
2a810 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69  apPage[--pCur->i
2a820 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65  Page];.  release
2a830 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61  PageNotNull(pLea
2a840 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  f);.}../*.** Mov
2a850 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2a860 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
2a870 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
2a880 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
2a890 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
2a8a0 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
2a8b0 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
2a8c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
2a8d0 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
2a8e0 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
2a8f0 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
2a900 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
2a910 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
2a920 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
2a930 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
2a940 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
2a950 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
2a960 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
2a970 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
2a980 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
2a990 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
2a9a0 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
2a9b0 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
2a9c0 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
2a9d0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
2a9e0 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
2a9f0 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
2aa00 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
2aa10 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ID and this rout
2aa20 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
2aa30 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77  TE_EMPTY. Otherw
2aa40 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73  ise,.** the curs
2aa50 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
2aa60 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
2aa70 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
2aa80 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20  the root.** (or 
2aa90 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
2aaa0 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
2aab0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
2aac0 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
2aad0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
2aae0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
2aaf0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
2ab00 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
2ab10 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
2ab20 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
2ab30 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
2ab40 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
2ab50 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
2ab60 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
2ab70 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
2ab80 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
2ab90 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
2aba0 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
2abb0 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
2abc0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2abd0 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
2abe0 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
2abf0 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
2ac00 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
2ac10 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
2ac20 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
2ac30 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
2ac40 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
2ac50 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
2ac60 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
2ac70 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
2ac80 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
2ac90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2aca0 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
2acb0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2acc0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
2acd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ace0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2acf0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2ad00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2ad10 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2ad20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2ad30 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2ad40 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
2ad50 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
2ad60 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2ad70 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
2ad80 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
2ad90 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2ada0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2adb0 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e < CURSOR_REQUI
2adc0 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e  RESEEK || pCur->
2add0 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73  iPage<0 );.  ass
2ade0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2adf0 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69  oot>0 || pCur->i
2ae00 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28  Page<0 );..  if(
2ae10 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2ae20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2ae30 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
2ae40 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2ae50 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ll(pCur->pPage);
2ae60 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d  .      while( --
2ae70 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
2ae80 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2ae90 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
2aea0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2aeb0 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ge]);.      }.  
2aec0 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
2aed0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
2aee0 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b  ];.      goto sk
2aef0 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20  ip_init;.    }. 
2af00 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d   }else if( pCur-
2af10 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a  >pgnoRoot==0 ){.
2af20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2af30 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2af40 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
2af50 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65  LITE_EMPTY;.  }e
2af60 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2af70 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
2af80 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  1) );.    if( pC
2af90 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
2afa0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2afb0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2afc0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2afd0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
2afe0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2aff0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
2b000 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2b010 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2b020 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
2b030 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2b040 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
2b050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
2b060 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2b070 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
2b080 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2b090 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  ot, &pCur->pPage
2b0a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b0b0 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75            0, pCu
2b0c0 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2b0d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2b0e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b0f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b100 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2b110 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2b120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2b130 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->iPage = 0;.   
2b140 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2b150 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   = pCur->pPage->
2b160 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52  intKey;.  }.  pR
2b170 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  oot = pCur->pPag
2b180 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  e;.  assert( pRo
2b190 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
2b1a0 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
2b1b0 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
2b1c0 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
2b1d0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
2b1e0 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
2b1f0 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
2b200 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
2b210 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
2b220 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
2b230 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
2b240 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
2b250 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
2b260 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
2b270 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2b280 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
2b290 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
2b2a0 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
2b2b0 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
2b2c0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2b2d0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
2b2e0 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
2b2f0 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
2b300 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
2b310 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
2b320 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2b330 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
2b340 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
2b350 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
2b360 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
2b370 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2b380 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
2b390 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
2b3a0 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
2b3b0 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
2b3c0 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
2b3d0 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
2b3e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
2b3f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
2b400 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
2b410 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
2b420 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
2b430 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
2b440 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2b450 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
2b460 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
2b470 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b480 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65  PAGE(pCur->pPage
2b490 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69  );.  }..skip_ini
2b4a0 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20  t:  .  pCur->ix 
2b4b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
2b4c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2b4d0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2b4e0 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2b4f0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2b500 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a  CF_ValidOvfl);..
2b510 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
2b520 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f  pPage;.  if( pRo
2b530 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ot->nCell>0 ){. 
2b540 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2b550 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2b560 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f    }else if( !pRo
2b570 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
2b580 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
2b590 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
2b5a0 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
2b5b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b5c0 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
2b5d0 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
2b5e0 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
2b5f0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2b600 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b610 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2b620 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2b630 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
2b640 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2b650 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2b660 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2b670 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b680 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74  EMPTY;.  }.  ret
2b690 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b6a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2b6b0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
2b6c0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2b6d0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2b6e0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2b6f0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2b700 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
2b710 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
2b720 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
2b730 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
2b740 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
2b750 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
2b760 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2b770 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
2b780 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2b790 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2b7a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b7b0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2b7c0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2b7d0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2b7e0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2b7f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b800 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b810 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
2b820 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b830 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
2b840 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
2b850 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2b860 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e  Cur->ix<pPage->n
2b870 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
2b880 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
2b890 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2b8a0 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->ix));.    rc =
2b8b0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2b8c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
2b8d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b8e0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2b8f0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2b900 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
2b910 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2b920 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
2b930 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2b940 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
2b950 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
2b960 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
2b970 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
2b980 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
2b990 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
2b9a0 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
2b9b0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
2b9c0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2b9d0 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
2b9e0 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
2b9f0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
2ba00 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2ba10 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
2ba20 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
2ba30 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2ba40 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
2ba50 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
2ba60 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
2ba70 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
2ba80 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2ba90 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
2baa0 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
2bab0 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
2bac0 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
2bad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2bae0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
2baf0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2bb00 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2bb10 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2bb20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2bb30 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2bb40 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
2bb50 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
2bb60 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
2bb70 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2bb80 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2bb90 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2bba0 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50     pCur->ix = pP
2bbb0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
2bbc0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2bbd0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
2bbe0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2bbf0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
2bc00 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  ->ix = pPage->nC
2bc10 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28  ell-1;.  assert(
2bc20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2bc30 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
2bc40 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2bc50 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2bc60 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ey)==0 );.  retu
2bc70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2bc80 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2bc90 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
2bca0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2bcb0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2bcc0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2bcd0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2bce0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2bcf0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2bd00 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2bd10 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2bd20 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2bd30 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2bd40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2bd50 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
2bd60 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2bd70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
2bd80 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2bd90 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2bda0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2bdb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2bdc0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2bdd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
2bde0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2bdf0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
2be00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2be10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2be20 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
2be30 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2be40 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
2be50 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2be60 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2be70 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20  LITE_EMPTY ){.  
2be80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2be90 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2bea0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2beb0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65  l==0 );.    *pRe
2bec0 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  s = 1;.    rc = 
2bed0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2bee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2bef0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2bf00 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
2bf10 20 63 75 72 73 6f 72 20 70 43 75 72 20 64 6f 65   cursor pCur doe
2bf20 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  s not point to a
2bf30 20 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20 4f   valid row..** O
2bf40 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
2bf50 72 20 69 73 20 76 61 6c 69 64 2c 20 63 6f 6e 66  r is valid, conf
2bf60 69 67 75 72 65 20 69 74 20 73 6f 20 74 68 61 74  igure it so that
2bf70 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
2bf80 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
2bf90 65 4e 65 78 74 28 29 20 69 73 20 61 20 6e 6f 2d  eNext() is a no-
2bfa0 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  op..*/.#ifndef S
2bfb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
2bfc0 57 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c 69 74  WFUNC.void sqlit
2bfd0 65 33 42 74 72 65 65 53 6b 69 70 4e 65 78 74 28  e3BtreeSkipNext(
2bfe0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2bff0 0a 20 20 2f 2a 20 57 65 20 62 65 6c 69 65 76 65  .  /* We believe
2c000 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2c010 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
2c020 69 6e 20 74 68 65 20 76 61 6c 69 64 20 73 74 61  in the valid sta
2c030 74 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 69  te when.  ** thi
2c040 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2c050 6c 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 6f  led, but the pro
2c060 6f 66 20 69 73 20 64 69 66 66 69 63 75 6c 74 2c  of is difficult,
2c070 20 73 6f 20 77 65 20 61 64 64 20 61 6e 0a 20 20   so we add an.  
2c080 2a 2a 20 41 4c 57 61 59 53 28 29 20 74 65 73 74  ** ALWaYS() test
2c090 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20 77 65   just in case we
2c0a0 20 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f 0a 20   are wrong. */. 
2c0b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
2c0c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2c0d0 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
2c0e0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2c0f0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20  RSOR_SKIPNEXT;. 
2c100 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2c110 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  t = 1;.  }.}.#en
2c120 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2c130 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
2c140 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2c150 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
2c160 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2c170 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2c180 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2c190 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2c1a0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2c1b0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2c1c0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2c1d0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2c1e0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2c1f0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2c200 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c210 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
2c220 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2c230 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
2c240 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2c250 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2c260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2c270 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2c280 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2c290 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2c2a0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2c2b0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
2c2c0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2c2d0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
2c2e0 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
2c2f0 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2c300 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d  eState && (pCur-
2c310 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2c320 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23  _AtLast)!=0 ){.#
2c330 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2c340 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
2c350 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
2c360 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
2c370 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
2c380 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
2c390 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
2c3a0 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
2c3b0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
2c3c0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2c3d0 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
2c3e0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
2c3f0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2c400 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
2c410 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
2c420 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2c430 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75  t( pCur->ix==pCu
2c440 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  r->pPage->nCell-
2c450 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2c460 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65   pCur->pPage->le
2c470 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
2c480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c490 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
2c4a0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2c4b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c4c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2c4d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2c4e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2c4f0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
2c500 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2c510 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2c520 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c540 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2c550 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2c560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c570 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c580 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
2c590 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2c5a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
2c5b0 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  TY ){.    assert
2c5c0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2c5d0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  ==0 || pCur->pPa
2c5e0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2c5f0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2c600 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c610 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2c620 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2c630 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2c640 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2c650 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2c660 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2c670 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2c680 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2c690 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2c6a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2c6b0 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2c6c0 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2c6d0 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2c6e0 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2c6f0 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2c700 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2c710 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2c720 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2c730 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2c740 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2c750 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2c760 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2c770 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2c780 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2c790 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2c7a0 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2c7b0 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2c7c0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2c7d0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2c7e0 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2c7f0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2c800 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2c810 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2c820 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2c830 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2c840 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2c850 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2c860 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2c870 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2c880 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2c890 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2c8a0 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2c8b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2c8c0 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2c8d0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2c8e0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2c8f0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2c900 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2c910 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2c930 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2c940 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2c950 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2c960 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2c970 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2c980 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2c990 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2c9a0 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2c9b0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2c9c0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2c9d0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2c9e0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2c9f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2ca00 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2ca10 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2ca20 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2ca30 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2ca40 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2ca50 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2ca60 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2ca80 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2ca90 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2caa0 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2cab0 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2cac0 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2cad0 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2cae0 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2caf0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2cb00 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2cb10 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2cb20 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2cb30 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2cb40 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2cb50 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2cb60 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2cb70 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2cb80 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2cb90 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2cba0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2cbb0 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cbd0 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2cbe0 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2cbf0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2cc00 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2cc10 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2cc20 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2cc30 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2cc40 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2cc50 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2cc60 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2cc70 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2cc80 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2cc90 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2cca0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ccb0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ccc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ccd0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2cce0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2ccf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2cd00 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2cd10 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2cd20 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2cd30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cd40 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2cd50 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64  OR_VALID || (pId
2cd60 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2cd70 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29  >curIntKey!=0) )
2cd80 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2cd90 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2cda0 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2cdb0 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2cdc0 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2cdd0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2cde0 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2cdf0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2ce00 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  */.  if( pIdxKey
2ce10 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ==0.   && pCur->
2ce20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2ce30 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
2ce40 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2ce50 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29  alidNKey)!=0.  )
2ce60 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2ce70 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2ce80 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2ce90 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2cea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ceb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2cec0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2ced0 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
2cee0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2cef0 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2cf00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2cf10 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  es = -1;.       
2cf20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cf30 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2cf40 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
2cf50 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20  sted key is one 
2cf60 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72  more than the pr
2cf70 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e  evious key, then
2cf80 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f  .      ** try to
2cf90 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67   get there using
2cfa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2cfb0 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  t() rather than 
2cfc0 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a full.      ** 
2cfd0 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
2cfe0 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2cff0 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54  ization only.  T
2d000 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2d010 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  r.      ** is st
2d020 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74  ill obtained wit
2d030 68 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20  hout this case, 
2d040 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f  only a little mo
2d050 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20  re slowely */.  
2d060 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2d070 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65  fo.nKey+1==intKe
2d080 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  y ){.        *pR
2d090 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2d0a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2d0b0 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a  eNext(pCur, 0);.
2d0c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2d0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d0e0 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e         getCellIn
2d0f0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
2d100 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2d110 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2d120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2d130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d140 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d150 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
2d160 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2d170 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2d180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d1a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d1b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d1c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
2d1d0 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
2d1e0 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
2d1f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69   = sqlite3VdbeFi
2d200 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65  ndCompare(pIdxKe
2d210 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d  y);.    pIdxKey-
2d220 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
2d230 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65    assert( pIdxKe
2d240 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31  y->default_rc==1
2d250 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2d260 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2d270 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  c==0 .         |
2d280 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
2d290 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b  lt_rc==-1.    );
2d2a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52  .  }else{.    xR
2d2b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30  ecordCompare = 0
2d2c0 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72  ; /* All keys ar
2d2d0 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20  e integers */.  
2d2e0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2d2f0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2d300 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
2d310 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59  rc==SQLITE_EMPTY
2d320 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2d330 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2d340 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  ==0 || pCur->pPa
2d350 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2d360 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
2d370 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2d380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d390 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d3a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
2d3b0 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
2d3c0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2d3d0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
2d3e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2d3f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2d400 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2d410 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2d420 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73 73 65 72  l > 0 );.  asser
2d430 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  t( pCur->iPage==
2d440 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2d450 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43  e[0]->intKey==pC
2d460 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b  ur->curIntKey );
2d470 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d480 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49  >curIntKey || pI
2d490 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
2d4a0 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
2d4b0 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20   upr, idx, c;.  
2d4c0 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
2d4d0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2d4e0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2d4f0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20  .    u8 *pCell; 
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2d520 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63  ter to current c
2d530 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
2d540 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e  .    /* pPage->n
2d550 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65  Cell must be gre
2d560 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
2d570 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
2d580 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
2d590 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  the cursor would
2d5a0 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c   have been INVAL
2d5b0 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69  ID above and thi
2d5c0 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20  s for(;;) loop. 
2d5d0 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49     ** not run. I
2d5e0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2d5f0 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65  e root-page, the
2d600 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c  n the moveToChil
2d610 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  d() routine.    
2d620 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c  ** would have al
2d630 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64  ready detected d
2d640 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69  b corruption. Si
2d650 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d  milarly, pPage m
2d660 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
2d670 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e  e right kind (in
2d680 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66  dex or table) of
2d690 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74   b-tree page. Ot
2d6a0 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
2d6b0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f   moveToChild() o
2d6c0 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63  r moveToRoot() c
2d6d0 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64  all would have d
2d6e0 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
2d6f0 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  on.  */.    asse
2d700 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2d710 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
2d720 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ( pPage->intKey=
2d730 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b  =(pIdxKey==0) );
2d740 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
2d750 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
2d760 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65  Cell-1;.    asse
2d770 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30  rt( biasRight==0
2d780 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31   || biasRight==1
2d790 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70   );.    idx = up
2d7a0 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29  r>>(1-biasRight)
2d7b0 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52  ; /* idx = biasR
2d7c0 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77  ight ? upr : (lw
2d7d0 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2d7e0 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2d7f0 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52  )idx;.    if( xR
2d800 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20  ecordCompare==0 
2d810 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  ){.      for(;;)
2d820 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43  {.        i64 nC
2d830 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2d840 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2d850 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69  PastPtr(pPage, i
2d860 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
2d870 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
2d880 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2d890 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a  while( 0x80 <= *
2d8a0 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20  (pCell++) ){.   
2d8b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2d8c0 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  ll>=pPage->aData
2d8d0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
2d8e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d8f0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
2d900 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2d910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d920 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d930 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
2d940 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
2d950 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
2d960 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
2d970 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2d980 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2d990 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2d9a0 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72  pr ){ c = -1; br
2d9b0 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2d9c0 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
2d9d0 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y>intKey ){.    
2d9e0 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2d9f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2da00 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2da10 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  +1; break; }.   
2da20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2da30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2da40 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
2da50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2da60 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2da70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2da80 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2da90 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
2daa0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
2dab0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
2dac0 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
2dad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dae0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2daf0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
2db00 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20  lidNKey;.       
2db10 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
2db20 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
2db30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
2db40 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2db50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  0;.            *
2db60 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2db70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2db80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2db90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2dba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
2dbb0 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
2dbc0 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
2dbd0 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
2dbe0 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  = (lwr+upr)/2; *
2dbf0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
2dc00 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  lse{.      for(;
2dc10 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ;){.        int 
2dc20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20  nCell;  /* Size 
2dc30 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c  of the pCell cel
2dc40 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  l in bytes */.  
2dc50 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2dc60 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2dc70 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20  age, idx);..    
2dc80 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
2dc90 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
2dca0 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
2dcb0 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
2dcc0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
2dcd0 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
2dce0 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
2dcf0 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
2dd00 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
2dd10 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
2dd20 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
2dd30 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
2dd40 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
2dd50 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
2dd60 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
2dd70 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
2dd80 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
2dd90 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
2dda0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
2ddb0 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
2ddc0 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
2ddd0 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
2dde0 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
2ddf0 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
2de00 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
2de10 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
2de20 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
2de30 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
2de40 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
2de50 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
2de60 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70         nCell = p
2de70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
2de80 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
2de90 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
2dea0 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
2deb0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
2dec0 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
2ded0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
2dee0 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
2def0 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
2df00 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
2df10 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
2df20 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2df30 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
2df40 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
2df50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2df60 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2df70 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61  Cell+1==pPage->a
2df80 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2df90 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2dfa0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2dfb0 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
2dfc0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2dfd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
2dfe0 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
2dff0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
2e000 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
2e010 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
2e020 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
2e030 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
2e040 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2e050 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2e060 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
2e070 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2e080 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
2e090 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
2e0a0 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
2e0b0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2e0c0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2e0d0 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32  e( pCell+nCell+2
2e0e0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2e0f0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2e100 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2e110 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2e120 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
2e130 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2e140 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2e150 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
2e160 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
2e170 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
2e180 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
2e190 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
2e1a0 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
2e1b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
2e1c0 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
2e1d0 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
2e1e0 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
2e1f0 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
2e200 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
2e210 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
2e220 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
2e230 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
2e240 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
2e250 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20   be called. .   
2e260 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2e270 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65      ** If the re
2e280 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c  cord is corrupt,
2e290 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70   the xRecordComp
2e2a0 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  are routine may 
2e2b0 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a  read.          *
2e2c0 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69  * up to two vari
2e2d0 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64  nts past the end
2e2e0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20   of the buffer. 
2e2f0 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20  An extra 18 .   
2e300 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20         ** bytes 
2e310 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c  of padding is al
2e320 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65  located at the e
2e330 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2e340 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   in.          **
2e350 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65   case this happe
2e360 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ns.  */.        
2e370 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
2e380 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
2e390 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
2e3a0 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
2e3b0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
2e3c0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2e3d0 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
2e3e0 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
2e3f0 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
2e400 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
2e410 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
2e420 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ey;.          te
2e430 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20  stcase( nCell<0 
2e440 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  );   /* True if 
2e450 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32  key size is 2^32
2e460 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20   or more */.    
2e470 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e480 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  nCell==0 );  /* 
2e490 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2e4a0 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2e4b0 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  0 */.          t
2e4c0 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2e4d0 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  1 );  /* Invalid
2e4e0 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2e4f0 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20   0x80 0x01 */.  
2e500 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2e510 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f  ( nCell==2 );  /
2e520 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20  * Minimum legal 
2e530 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a  index key size *
2e540 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2e550 6e 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65 6c 6c  nCell<2 || nCell
2e560 2f 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62  /pCur->pBt->usab
2e570 6c 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70 42 74  leSize>pCur->pBt
2e580 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->nPage ){.     
2e590 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2e5a0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
2e5b0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2e5c0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2e5d0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2e5e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2e5f0 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
2e600 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38  Malloc( nCell+18
2e610 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2e620 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
2e630 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2e640 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2e650 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2e660 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2e670 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2e680 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2e690 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2e6a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
2e6b0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
2e6c0 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
2e6d0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
2e6e0 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  llKey, 0);.     
2e6f0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2e700 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c  ags &= ~BTCF_Val
2e710 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20  idOvfl;.        
2e720 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2e730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e740 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2e750 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2e760 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2e770 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e780 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2e790 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2e7a0 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
2e7b0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
2e7c0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2e7d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Key);.        }.
2e7e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49  .            (pI
2e800 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2e810 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
2e820 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  | c==0).        
2e830 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72   && (pIdxKey->er
2e840 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f  rCode!=SQLITE_NO
2e850 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74  MEM || pCur->pBt
2e860 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ree->db->mallocF
2e870 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29  ailed).        )
2e880 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c  ;.        if( c<
2e890 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  0 ){.          l
2e8a0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
2e8b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e      }else if( c>
2e8c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
2e8d0 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2e8e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e8f0 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d       assert( c==
2e900 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 );.          *
2e910 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2e920 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e930 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  OK;.          pC
2e940 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2e950 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
2e960 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2e970 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  e ) rc = SQLITE_
2e980 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2e990 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2e9a0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2e9b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2e9c0 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
2e9d0 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
2e9e0 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2e9f0 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2ea00 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2ea10 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2ea20 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
2ea30 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2ea40 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
2ea50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
2ea60 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
2ea70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ea80 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2ea90 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2eaa0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
2eab0 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72  t( pCur->ix<pCur
2eac0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
2ead0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78  ;.      pCur->ix
2eae0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2eaf0 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
2eb00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2eb10 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
2eb20 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2eb30 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f    }.moveto_next_
2eb40 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c  layer:.    if( l
2eb50 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
2eb60 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
2eb70 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2eb80 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2eb90 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2eba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ebb0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2ebc0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2ebd0 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
2ebe0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2ebf0 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20  u16)lwr;.    rc 
2ec00 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2ec10 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
2ec20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2ec30 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
2ec40 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  sh:.  pCur->info
2ec50 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73  .nSize = 0;.  as
2ec60 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2ec70 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2ec80 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20  idOvfl)==0 );.  
2ec90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2eca0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2ecb0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2ecc0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
2ecd0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
2ece0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
2ecf0 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
2ed00 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
2ed10 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
2ed20 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
2ed30 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
2ed40 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2ed50 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
2ed60 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
2ed70 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
2ed80 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
2ed90 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
2eda0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2edb0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2edc0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
2edd0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
2ede0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
2edf0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
2ee00 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2ee10 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
2ee20 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
2ee30 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
2ee40 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
2ee50 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
2ee60 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
2ee70 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
2ee80 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
2ee90 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
2eea0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
2eeb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
2eec0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
2eed0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
2eee0 65 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65  estimate for the
2eef0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2ef00 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
2ef10 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69  t pCur is.** poi
2ef20 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72  nting to.  Retur
2ef30 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2ef40 62 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61  ber if no estima
2ef50 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  te is currently 
2ef60 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  .** available..*
2ef70 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
2ef80 65 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74  eeRowCountEst(Bt
2ef90 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2efa0 20 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a   i64 n;.  u8 i;.
2efb0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2efc0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2efd0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2efe0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2eff0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2f000 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2f010 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20  .  /* Currently 
2f020 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69  this interface i
2f030 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
2f040 20 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65   the OP_IfSmalle
2f050 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61  r.  ** opcode, a
2f060 6e 64 20 69 74 20 74 68 61 74 20 63 61 73 65 20  nd it that case 
2f070 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  the cursor will 
2f080 61 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64 20  always be valid 
2f090 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c  and.  ** will al
2f0a0 77 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20  ways point to a 
2f0b0 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20  leaf node. */.  
2f0c0 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e  if( NEVER(pCur->
2f0d0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f0e0 41 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d  ALID) ) return -
2f0f0 31 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  1;.  if( NEVER(p
2f100 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66  Cur->pPage->leaf
2f110 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31  ==0) ) return -1
2f120 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70  ;..  n = pCur->p
2f130 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66  Page->nCell;.  f
2f140 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e  or(i=0; i<pCur->
2f150 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
2f160 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61   n *= pCur->apPa
2f170 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  ge[i]->nCell;.  
2f180 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
2f190 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
2f1a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2f1b0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
2f1c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a  he database. .**
2f1d0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a   Return value:.*
2f1e0 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f  *.**    SQLITE_O
2f1f0 4b 20 20 20 20 20 20 20 20 73 75 63 63 65 73 73  K        success
2f200 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f  .**    SQLITE_DO
2f210 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72 20 69  NE      cursor i
2f220 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2f230 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74 20 65  ng at the last e
2f240 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68  lement.**    oth
2f250 65 72 77 69 73 65 20 20 20 20 20 20 20 20 73 6f  erwise        so
2f260 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  me kind of error
2f270 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20   occurred.**.** 
2f280 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2f290 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2f2a0 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61  treeNext().  Tha
2f2b0 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2f2c0 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2f2d0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2f2e0 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e   merely incremen
2f2f0 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2f300 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2f310 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iIdx.** to the n
2f320 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ext cell on the 
2f330 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2f340 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2f350 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a  eNext() helper.*
2f360 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2f370 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2f380 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2f390 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2f3a0 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65  page or.** to re
2f3b0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2f3c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30  ..**.** If bit 0
2f3d0 78 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67  x01 of the F arg
2f3e0 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  ument in sqlite3
2f3f0 42 74 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69  BtreeNext(C,F) i
2f400 73 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  s 1, then the.**
2f410 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f   cursor correspo
2f420 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
2f430 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75  dex and this rou
2f440 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
2f450 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20  been.** skipped 
2f460 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78  if the SQL index
2f470 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71   had been a uniq
2f480 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46  ue index.  The F
2f490 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
2f4a0 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
2f4b0 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65  plement.  SQLite
2f4c0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2f4d0 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75  ation does not u
2f4e0 73 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c  se.** this hint,
2f4f0 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73   but COMDB2 does
2f500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
2f510 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
2f520 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  btreeNext(BtCurs
2f530 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
2f540 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
2f550 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2f560 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2f570 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2f580 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
2f590 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2f5a0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2f5b0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2f5c0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2f5d0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2f5e0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2f5f0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2f600 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2f610 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f620 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f630 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2f640 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2f650 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2f660 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f670 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
2f680 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2f690 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2f6a0 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 70 43  NEXT ){.      pC
2f6b0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2f6c0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2f6d0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2f6e0 65 78 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53  ext>0 ) return S
2f6f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2f700 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2f710 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64  Cur->pPage;.  id
2f720 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a  x = ++pCur->ix;.
2f730 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
2f740 49 6e 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Init ){.    /* T
2f750 68 65 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61  he only known wa
2f760 79 20 66 6f 72 20 74 68 69 73 20 74 6f 20 68 61  y for this to ha
2f770 70 70 65 6e 20 69 73 20 66 6f 72 20 74 68 65 72  ppen is for ther
2f780 65 20 74 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a  e to be a.    **
2f790 20 72 65 63 75 72 73 69 76 65 20 53 51 4c 20 66   recursive SQL f
2f7a0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65  unction that doe
2f7b0 73 20 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61  s a DELETE opera
2f7c0 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tion as part of 
2f7d0 61 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  a.    ** SELECT 
2f7e0 77 68 69 63 68 20 64 65 6c 65 74 65 73 20 63 6f  which deletes co
2f7f0 6e 74 65 6e 74 20 6f 75 74 20 66 72 6f 6d 20 75  ntent out from u
2f800 6e 64 65 72 20 61 6e 20 61 63 74 69 76 65 20 63  nder an active c
2f810 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 20  ursor.    ** in 
2f820 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
2f830 73 65 20 66 69 6c 65 20 77 68 65 72 65 20 74 68  se file where th
2f840 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 44 45  e table being DE
2f850 4c 45 54 45 2d 65 64 20 66 72 6f 6d 0a 20 20 20  LETE-ed from.   
2f860 20 2a 2a 20 68 61 73 20 70 61 67 65 73 20 69 6e   ** has pages in
2f870 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65   common with the
2f880 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   table being que
2f890 72 69 65 64 2e 20 20 53 65 65 20 54 48 33 0a 20  ried.  See TH3. 
2f8a0 20 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f 76     ** module cov
2f8b0 31 2f 62 74 72 65 65 37 38 2e 74 65 73 74 20 74  1/btree78.test t
2f8c0 65 73 74 63 61 73 65 20 32 32 30 20 28 32 30 31  estcase 220 (201
2f8d0 38 2d 30 36 2d 30 38 29 20 66 6f 72 20 61 6e 0a  8-06-08) for an.
2f8e0 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2e 20      ** example. 
2f8f0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
2f900 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f910 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
2f920 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f930 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74  e is corrupt, it
2f940 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
2f950 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64   the value of id
2f960 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  x .  ** to be in
2f970 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73  valid here. This
2f980 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20   can only occur 
2f990 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  if a second curs
2f9a0 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a  or modifies.  **
2f9b0 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20   the page while 
2f9c0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68  cursor pCur is h
2f9d0 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
2f9e0 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20  ce to it. Which 
2f9f0 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61  can.  ** only ha
2fa00 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  ppen if the data
2fa10 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20  base is corrupt 
2fa20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
2fa30 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a   to link the.  *
2fa40 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65  * page into more
2fa50 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
2fa60 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
2fa70 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70   testcase( idx>p
2fa80 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
2fa90 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
2faa0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
2fab0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2fac0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
2fad0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2fae0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2faf0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2fb00 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
2fb10 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2fb20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65  urn rc;.      re
2fb30 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2fb40 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
2fb50 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
2fb60 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2fb70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2fb80 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2fb90 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2fba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fbb0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
2fbc0 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
2fbd0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
2fbe0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2fbf0 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  age;.    }while(
2fc00 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65   pCur->ix>=pPage
2fc10 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
2fc20 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2fc30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2fc40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2fc50 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  t(pCur, 0);.    
2fc60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2fc70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2fc80 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2fc90 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2fca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fcb0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2fcc0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2fcd0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2fce0 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2fcf0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2fd00 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61  r *pCur, int fla
2fd10 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gs){.  MemPage *
2fd20 70 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f  pPage;.  UNUSED_
2fd30 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73  PARAMETER( flags
2fd40 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20   );  /* Used in 
2fd50 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e  COMDB2 but not n
2fd60 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a  ative SQLite */.
2fd70 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2fd80 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2fd90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2fda0 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
2fdb0 73 3d 3d 31 20 29 3b 0a 20 20 70 43 75 72 2d 3e  s==1 );.  pCur->
2fdc0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2fdd0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2fde0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2fdf0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2fe00 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75 72  vfl);.  if( pCur
2fe10 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2fe20 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20  _VALID ) return 
2fe30 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b  btreeNext(pCur);
2fe40 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2fe50 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 28 2b  >pPage;.  if( (+
2fe60 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67  +pCur->ix)>=pPag
2fe70 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2fe80 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20  pCur->ix--;.    
2fe90 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2fea0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69 66  (pCur);.  }.  if
2feb0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2fec0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2fed0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2fee0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2fef0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2ff00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
2ff10 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
2ff20 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
2ff30 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
2ff40 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2ff50 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
2ff60 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
2ff70 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63 65  ITE_OK     succe
2ff80 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ss.**     SQLITE
2ff90 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72 73  _DONE   the curs
2ffa0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e  or is already on
2ffb0 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
2ffc0 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  nt of the table.
2ffd0 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73 65  **     otherwise
2ffe0 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f       some kind o
2fff0 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  f error occurred
30000 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
30010 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
30020 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
30030 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ous().  That rou
30040 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
30050 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
30060 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
30070 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20  ly decrementing 
30080 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
30090 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
300a0 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ** to the previo
300b0 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  us cell on the c
300c0 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
300d0 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
300e0 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65  Previous().** he
300f0 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20  lper routine is 
30100 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
30110 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
30120 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
30130 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f  nt page.** or to
30140 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
30150 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69  sor..**.** If bi
30160 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20  t 0x01 of the F 
30170 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
30180 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
30190 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e  (C,F) is 1, then
301a0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 63  .** the cursor c
301b0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
301c0 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74   SQL index and t
301d0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
301e0 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73  d have been.** s
301f0 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51  kipped if the SQ
30200 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
30210 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e   a unique index.
30220 20 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74    The F argument
30230 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74 6f   is a.** hint to
30240 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20   the implement. 
30250 20 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c 69   The native SQLi
30260 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
30270 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
30280 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69 6e  .** use this hin
30290 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f  t, but COMDB2 do
302a0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  es..*/.static SQ
302b0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
302c0 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  t btreePrevious(
302d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
302e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
302f0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
30300 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
30310 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
30320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
30330 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
30340 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
30350 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
30360 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
30370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
30380 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
30390 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
303a0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
303b0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
303c0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
303d0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
303e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
303f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
30400 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
30410 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
30420 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
30430 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  te ){.      retu
30440 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
30450 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
30460 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70  RSOR_SKIPNEXT==p
30470 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
30480 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
30490 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
304a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
304b0 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 20 72  ->skipNext<0 ) r
304c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
304d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
304e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
304f0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
30500 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
30510 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
30520 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
30530 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20  = pCur->ix;.    
30540 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
30550 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
30560 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
30570 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
30580 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
30590 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
305a0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
305b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
305c0 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20  le( pCur->ix==0 
305d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
305e0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
305f0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
30600 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
30610 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
30620 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
30630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30640 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
30650 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  r);.    }.    as
30660 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
30670 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  .nSize==0 );.   
30680 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
30690 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
306a0 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20  _ValidOvfl))==0 
306b0 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78  );..    pCur->ix
306c0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
306d0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
306e0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
306f0 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
30700 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
30710 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
30720 76 69 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a  vious(pCur, 0);.
30730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30750 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
30760 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
30770 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
30780 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
30790 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  r, int flags){. 
307a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
307b0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
307c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
307d0 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
307e0 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
307f0 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73  PARAMETER( flags
30800 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20   );  /* Used in 
30810 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e  COMDB2 but not n
30820 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a  ative SQLite */.
30830 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
30840 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
30850 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
30860 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
30870 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
30880 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
30890 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
308a0 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
308b0 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20   pCur->ix==0.   
308c0 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  || pCur->pPage->
308d0 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  leaf==0.  ){.   
308e0 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65   return btreePre
308f0 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20 7d  vious(pCur);.  }
30900 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20  .  pCur->ix--;. 
30910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30920 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
30930 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
30940 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
30950 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
30960 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
30970 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
30980 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
30990 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
309a0 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
309b0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
309c0 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
309d0 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
309e0 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
309f0 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
30a00 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
30a10 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
30a20 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
30a30 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
30a40 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
30a50 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
30a60 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
30a70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
30a80 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
30a90 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
30aa0 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
30ab0 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
30ac0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
30ad0 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65   NULL in the eve
30ae0 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
30af0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
30b00 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
30b10 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
30b20 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
30b30 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
30b40 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
30b50 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
30b60 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
30b70 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
30b80 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
30b90 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
30ba0 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
30bb0 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
30bc0 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
30bd0 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
30be0 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
30bf0 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
30c00 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65  .** If the eMode
30c10 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54   parameter is BT
30c20 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
30c30 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20  the nearby page 
30c40 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65  exists.** anywhe
30c50 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
30c60 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
30c70 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
30c80 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a   returned.  If.*
30c90 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  * eMode is BTALL
30ca0 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70  OC_LT then the p
30cb0 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  age returned wil
30cc0 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  l be less than o
30cd0 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65  r equal.** to ne
30ce0 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68  arby if any such
30cf0 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49   page exists.  I
30d00 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  f eMode is BTALL
30d10 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72  OC_ANY then ther
30d20 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74  e.** are no rest
30d30 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63  rictions on whic
30d40 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e  h page is return
30d50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
30d60 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
30d70 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
30d80 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pBt,         /*
30d90 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
30da0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
30db0 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
30dc0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
30dd0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65  llocated page he
30de0 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  re */.  Pgno *pP
30df0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
30e00 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65  * Store the page
30e10 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
30e20 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20    Pgno nearby,  
30e30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
30e40 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65  ch for a page ne
30e50 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ar this one */. 
30e60 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20   u8 eMode       
30e70 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c          /* BTALL
30e80 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f  OC_EXACT, BTALLO
30e90 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43  C_LT, or BTALLOC
30ea0 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  _ANY */.){.  Mem
30eb0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
30ec0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
30ed0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30ee0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
30ef0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
30f00 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
30f10 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
30f20 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
30f30 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
30f40 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
30f50 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
30f60 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
30f70 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
30f80 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
30f90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30fa0 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
30fb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30fc0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
30fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d   );.  assert( eM
30fe0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
30ff0 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26   || (nearby>0 &&
31000 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
31010 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29  ->autoVacuum)) )
31020 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
31030 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
31040 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
31050 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45  unt(pBt);.  /* E
31060 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35  VIDENCE-OF: R-05
31070 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d  119-02637 The 4-
31080 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
31090 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
310a0 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73  t 36.  ** stores
310b0 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61   stores the tota
310c0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
310d0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
310e0 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34  t. */.  n = get4
310f0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
31100 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
31110 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
31120 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
31130 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
31140 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
31150 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
31160 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
31170 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
31180 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
31190 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
311a0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
311b0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
311c0 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
311d0 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
311e0 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
311f0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
31200 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
31210 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b  u32 nSearch = 0;
31220 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74     /* Count of t
31230 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61  he number of sea
31240 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a  rch attempts */.
31250 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65      .    /* If e
31260 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
31270 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20  ACT and a query 
31280 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
31290 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
312a0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
312b0 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
312c0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
312d0 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
312e0 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
312f0 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
31300 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
31310 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
31320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31330 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
31340 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
31350 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66  XACT ){.      if
31360 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  ( nearby<=mxPage
31370 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
31380 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Type;.        as
31390 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
313a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
313b0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
313c0 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m );.        rc 
313d0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
313e0 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
313f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
31400 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
31410 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79  .        if( eTy
31420 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
31430 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AGE ){.         
31440 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
31450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31460 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
31470 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31480 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
31490 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
314a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
314b0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
314c0 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
314d0 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
314e0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
314f0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
31500 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
31510 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
31520 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
31530 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
31540 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31550 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
31560 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
31570 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31580 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
31590 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
315a0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
315b0 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
315c0 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
315d0 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
315e0 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
315f0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
31600 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
31610 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
31620 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
31630 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
31640 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
31650 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
31660 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
31670 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
31680 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72  EXACT).    ** or
31690 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65   until a page le
316a0 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27  ss than 'nearby'
316b0 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
316c0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a  de==BTALLOC_LT).
316d0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
316e0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
316f0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
31700 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
31710 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
31720 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35  IDENCE-OF: R-015
31730 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72  06-11053 The fir
31740 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  st integer on a 
31750 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
31760 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  age.        ** i
31770 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
31780 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72  r of the next fr
31790 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
317a0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72  e in the list or
317b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  .        ** zero
317c0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
317d0 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72  last freelist tr
317e0 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  unk page. */.   
317f0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
31800 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
31810 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
31820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31830 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
31840 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39  OF: R-59841-1379
31850 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  8 The 4-byte big
31860 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
31870 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20  at offset 32.   
31880 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74       ** stores t
31890 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
318a0 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
318b0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
318c0 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20  , or zero if.   
318d0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
318e0 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a  list is empty. *
318f0 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
31900 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
31910 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
31920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
31930 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
31940 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
31950 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
31960 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20  ge || nSearch++ 
31970 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  > n ){.        r
31980 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
31990 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72 75  PT_PGNO(pPrevTru
319a0 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b 2d  nk ? pPrevTrunk-
319b0 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20 20  >pgno : 1);.    
319c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
319d0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
319e0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54  usedPage(pBt, iT
319f0 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
31a00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31a10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
31a20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
31a30 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
31a40 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
31a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
31a60 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
31a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31a80 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
31a90 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   );.      /* EVI
31aa0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32  DENCE-OF: R-1352
31ab0 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f  3-04394 The seco
31ac0 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  nd integer on a 
31ad0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
31ae0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
31af0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
31b00 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  af page pointers
31b10 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20   to follow. */. 
31b20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
31b30 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
31b40 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
31b50 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
31b60 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
31b70 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
31b80 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
31b90 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
31ba0 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
31bb0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
31bc0 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
31bd0 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
31be0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
31bf0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
31c00 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
31c10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31c20 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
31c30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
31c40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31c50 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
31c60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31c70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
31c80 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
31c90 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
31ca0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
31cb0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
31cc0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
31cd0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
31ce0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31cf0 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
31d00 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
31d10 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
31d20 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
31d30 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
31d40 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
31d50 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
31d60 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
31d70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
31d80 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
31d90 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
31da0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
31db0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
31dc0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
31dd0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
31de0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31df0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69  E_CORRUPT_PGNO(i
31e00 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
31e10 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31e20 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
31e30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31e40 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
31e50 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
31e60 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t .            &
31e70 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  & (nearby==iTrun
31e80 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61  k || (iTrunk<nea
31e90 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
31ea0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
31eb0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
31ec0 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
31ed0 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
31ee0 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
31ef0 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
31f00 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
31f10 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
31f20 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
31f30 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
31f40 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  */.        *pPgn
31f50 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
31f60 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
31f70 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
31f80 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
31f90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31fa0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
31fb0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
31fc0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
31fd0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
31fe0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31ff0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
32000 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
32010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
32020 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
32030 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
32040 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
32050 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
32060 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
32070 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32080 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
32090 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
320a0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
320b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
320c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
320d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
320e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
320f0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32100 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32110 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
32120 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
32130 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
32140 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
32150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32170 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
32180 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
32190 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
321a0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
321b0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
321c0 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
321d0 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
321e0 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
321f0 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
32200 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
32210 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
32220 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
32230 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
32240 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
32250 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
32260 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
32270 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
32280 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
32290 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
322a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
322b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
322c0 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
322d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
322e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
322f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32300 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
32310 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
32320 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
32330 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
32340 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  edPage(pBt, iNew
32350 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
32360 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
32370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32380 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32390 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
323a0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
323b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
323c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
323d0 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
323e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
323f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32410 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
32420 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
32430 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32440 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32450 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
32460 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
32470 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
32480 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
32490 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
324a0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
324b0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
324c0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
324d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
324e0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
324f0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
32500 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
32510 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
32520 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
32530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32540 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
32550 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
32560 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
32570 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
32580 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
32590 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
325a0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
325b0 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
325c0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
325d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
325e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
325f0 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
32600 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
32610 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
32620 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
32630 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32640 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32660 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
32670 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
32680 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
32690 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
326a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
326b0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
326c0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
326d0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
326e0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
326f0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
32700 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
32710 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30     }else if( k>0
32720 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
32730 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
32740 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
32750 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73          u32 clos
32760 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
32770 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
32780 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
32790 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
327a0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69  aData;.        i
327b0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
327c0 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
327d0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
327e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
327f0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
32800 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
32810 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
32820 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
32830 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
32840 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
32850 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  8+i*4]);.       
32860 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
32870 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  <=nearby ){.    
32880 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
32890 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
328a0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
328b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
328c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
328d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
328e0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
328f0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
32900 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41   dist = sqlite3A
32910 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
32920 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
32930 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
32940 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
32950 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
32960 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
32970 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
32980 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
32990 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  i*4]) - nearby);
329a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
329b0 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
329c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
329d0 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
329e0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
329f0 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
32a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32a10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
32a20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32a30 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
32a40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
32a50 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
32a60 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
32a70 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
32a80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32a90 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
32aa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
32ab0 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20  Page>mxPage ){. 
32ac0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32ad0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
32ae0 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  O(iTrunk);.     
32af0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32b00 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
32b20 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
32b30 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
32b40 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
32b50 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  t .         || (
32b60 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c  iPage==nearby ||
32b70 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26   (iPage<nearby &
32b80 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
32b90 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29  _LE)) .        )
32ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
32bb0 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
32bc0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
32bd0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
32be0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
32bf0 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
32c00 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
32c10 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
32c20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
32c30 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
32c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
32c50 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
32c60 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
32c70 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
32c80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32c90 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
32ca0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
32cb0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
32cc0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
32cd0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
32ce0 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
32cf0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
32d00 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
32d10 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
32d20 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
32d30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32d40 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
32d50 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
32d60 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74            noCont
32d70 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48  ent = !btreeGetH
32d80 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a  asContent(pBt, *
32d90 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45  pPgno)? PAGER_GE
32da0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b  T_NOCONTENT : 0;
32db0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32dc0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
32dd0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
32de0 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
32df0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
32e00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
32e20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32e30 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
32e40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32e50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32e70 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
32e80 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
32e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
32ea0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
32eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
32ed0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
32ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32ef0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
32f00 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
32f10 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
32f20 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
32f30 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
32f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
32f50 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
32f60 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
32f70 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20  st, so append a 
32f80 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a  new page to the.
32f90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
32fa0 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  image..    **.  
32fb0 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e    ** Normally, n
32fc0 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74  ew pages allocat
32fd0 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
32fe0 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65   can be requeste
32ff0 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  d from the.    *
33000 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  * pager layer wi
33010 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
33020 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68  nt' flag set. Th
33030 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  is prevents the 
33040 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f  pager.    ** fro
33050 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64  m trying to read
33060 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65   the pages conte
33070 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f  nt from disk. Ho
33080 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20  wever, if the.  
33090 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61    ** current tra
330a0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
330b0 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20  eady run one or 
330c0 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  more incremental
330d0 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73  -vacuum.    ** s
330e0 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70  teps, then the p
330f0 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74  age we are about
33100 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79   to allocate may
33110 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74   contain content
33120 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
33130 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
33140 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
33150 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
33160 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  e, do.    ** not
33170 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74   set the no-cont
33180 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63  ent flag. This c
33190 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20  auses the pager 
331a0 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72  to load and jour
331b0 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  nal.    ** the c
331c0 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
331d0 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77  ent before overw
331e0 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
331f0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
33200 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  at the pager wil
33210 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  l not actually a
33220 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f  ttempt to load o
33230 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  r journal .    *
33240 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  * content for an
33250 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c  y page that real
33260 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74  ly does lie past
33270 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
33280 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
33290 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  file on disk. So
332a0 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
332b0 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f  disabling the no
332c0 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a  -content optimiz
332d0 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72  ation.    ** her
332e0 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74  e are confined t
332f0 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68  o those pages th
33300 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74  at lie between t
33310 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
33320 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
33330 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20  age and the end 
33340 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
33350 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
33360 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20   int bNoContent 
33370 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41  = (0==IfNotOmitA
33380 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
33390 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  te))? PAGER_GET_
333a0 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20  NOCONTENT:0;..  
333b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
333c0 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
333d0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
333e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
333f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
33400 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
33410 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
33420 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
33430 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
33440 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
33450 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
33460 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
33470 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
33480 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
33490 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
334a0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
334b0 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
334c0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
334d0 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
334e0 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
334f0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
33500 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
33510 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
33520 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
33530 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
33540 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
33550 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
33560 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
33570 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
33580 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
33590 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
335a0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
335b0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
335c0 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
335d0 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
335e0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
335f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
33600 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
33610 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
33620 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
33630 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
33640 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
33650 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
33660 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
33670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33680 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
33690 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
336a0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
336b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
336c0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
336d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
336e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
336f0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
33700 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
33710 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
33720 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
33730 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
33740 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
33750 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
33760 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
33770 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
33780 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
33790 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
337a0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
337b0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
337c0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
337d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
337e0 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
337f0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
33800 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  Content);.    if
33810 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
33820 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33830 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
33840 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
33850 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
33860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33870 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
33880 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
33890 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Page = 0;.    }.
338a0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
338b0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
338c0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
338d0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
338e0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
338f0 42 20 7c 7c 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  B || *pPgno!=PEN
33900 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
33910 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
33920 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
33930 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
33940 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
33950 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61  pPrevTrunk);.  a
33960 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
33970 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
33980 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
33990 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
339a0 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73  age)<=1 );.  ass
339b0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
339c0 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  OK || (*ppPage)-
339d0 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
339e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
339f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
33a00 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
33a10 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
33a20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33a30 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
33a40 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
33a50 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
33a60 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
33a70 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
33a80 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
33a90 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
33aa0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
33ab0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
33ac0 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
33ad0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
33ae0 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
33af0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
33b00 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
33b10 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
33b20 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
33b30 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
33b40 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
33b50 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
33b60 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
33b70 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
33b80 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
33b90 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
33ba0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
33bb0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
33bc0 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
33bd0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
33be0 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
33bf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
33c00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
33c10 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
33c20 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
33c30 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
33c40 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
33c50 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
33c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
33c70 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
33c80 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
33c90 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
33ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
33cb0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
33cc0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
33cd0 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
33ce0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
33cf0 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
33d00 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
33d10 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
33d20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
33d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d40 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
33d50 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
33d60 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
33d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33d90 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
33da0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
33db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33dc0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
33dd0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
33de0 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
33df0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
33e00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
33e10 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
33e20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
33e30 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b  DB || iPage>1 );
33e40 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
33e50 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
33e60 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
33e70 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20  ..  if( iPage<2 
33e80 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
33e90 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
33ea0 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
33eb0 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
33ec0 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
33ed0 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
33ee0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
33ef0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
33f00 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
33f10 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
33f20 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
33f30 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
33f40 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
33f50 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
33f60 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
33f70 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
33f80 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
33f90 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
33fa0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
33fb0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
33fc0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
33fd0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
33fe0 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69  , nFree+1);..  i
33ff0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
34000 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
34010 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LETE ){.    /* I
34020 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  f the secure_del
34030 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ete option is en
34040 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  abled, then.    
34050 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
34060 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
34070 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
34080 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
34090 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
340a0 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65   && ((rc = btree
340b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
340c0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
340d0 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
340e0 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
340f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34100 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
34110 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
34120 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
34130 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
34140 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
34150 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
34160 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
34170 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
34180 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
34190 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
341a0 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
341b0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
341c0 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
341d0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
341e0 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
341f0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
34200 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50  M ){.    ptrmapP
34210 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
34220 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
34230 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  0, &rc);.    if(
34240 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
34250 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
34260 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
34270 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
34280 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
34290 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
342a0 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
342b0 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
342c0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
342d0 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
342e0 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
342f0 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
34300 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
34310 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
34320 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
34330 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
34340 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
34350 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
34360 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
34370 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
34380 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
34390 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
343a0 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
343b0 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
343c0 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
343d0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
343e0 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
343f0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
34400 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
34410 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  e!=0 ){.    u32 
34420 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
34430 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
34440 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
34450 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
34460 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
34470 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
34480 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
34490 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
344a0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
344b0 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
344c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
344d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
344e0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
344f0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
34500 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
34510 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
34520 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4]);.    assert(
34530 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34540 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >32 );.    if( n
34550 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d  Leaf > (u32)pBt-
34560 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
34570 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
34580 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34590 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
345a0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
345b0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
345c0 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f < (u32)pBt->us
345d0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
345e0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
345f0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
34600 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
34610 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
34620 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
34630 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
34640 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
34650 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
34660 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
34670 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
34680 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
34690 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
346a0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
346b0 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
346c0 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
346d0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
346e0 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
346f0 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
34700 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
34710 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
34720 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
34730 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
34740 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
34750 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
34760 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
34770 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
34780 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
34790 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
347a0 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
347b0 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
347c0 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
347d0 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
347e0 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
347f0 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
34800 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
34810 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
34820 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74  continue to rest
34830 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
34840 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
34850 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
34860 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
34870 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
34880 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
34890 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
348a0 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
348b0 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
348c0 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
348d0 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
348e0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
348f0 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
34900 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
34910 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
34920 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
34930 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -8"..      **.  
34940 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
34950 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37  OF: R-19920-1157
34960 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72  6 However, newer
34970 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
34980 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20  ite still.      
34990 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74  ** avoid using t
349a0 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72  he last six entr
349b0 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c  ies in the freel
349c0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61  ist trunk page a
349d0 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a  rray in.      **
349e0 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61   order that data
349f0 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74  base files creat
34a00 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73  ed by newer vers
34a10 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
34a20 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72  an be.      ** r
34a30 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ead by older ver
34a40 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e  sions of SQLite.
34a50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34a60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34a70 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
34a80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
34a90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
34ab0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
34ac0 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
34ad0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
34ae0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
34af0 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
34b00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
34b10 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d  ( pPage && (pBt-
34b20 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
34b30 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d  SECURE_DELETE)==
34b40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
34b50 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
34b60 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
34b70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
34b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
34b90 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
34ba0 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  pBt, iPage);.   
34bb0 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
34bc0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
34bd0 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
34be0 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
34bf0 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
34c00 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  no));.      goto
34c10 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
34c20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
34c30 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
34c40 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
34c50 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70  hen it was not p
34c60 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
34c70 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  he.  ** the page
34c80 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
34c90 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74  a leaf page of t
34ca0 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  he first trunk i
34cb0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
34cc0 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62  .  ** Possibly b
34cd0 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d  ecause the free-
34ce0 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f  list is empty, o
34cf0 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75  r possibly becau
34d00 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72  se the .  ** fir
34d10 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
34d20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
34d30 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  l. Either way, t
34d40 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
34d50 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  eed.  ** will be
34d60 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72  come the new fir
34d70 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
34d80 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
34d90 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
34da0 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
34db0 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  !=(rc = btreeGet
34dc0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
34dd0 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a   &pPage, 0)) ){.
34de0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
34df0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20  e_out;.  }.  rc 
34e00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34e10 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
34e20 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
34e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34e40 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34e50 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
34e60 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
34e70 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
34e80 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
34e90 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
34ea0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
34eb0 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
34ec0 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
34ed0 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
34ee0 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
34ef0 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
34f00 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
34f10 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
34f20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
34f30 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
34f40 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
34f50 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
34f60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
34f70 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
34f80 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  c;.}.static void
34f90 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
34fa0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70  e *pPage, int *p
34fb0 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
34fc0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
34fd0 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50      *pRC = freeP
34fe0 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c  age2(pPage->pBt,
34ff0 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70   pPage, pPage->p
35000 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gno);.  }.}../*.
35010 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
35020 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
35030 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
35040 69 76 65 6e 20 43 65 6c 6c 2e 20 20 53 74 6f 72  iven Cell.  Stor
35050 65 0a 2a 2a 20 73 69 7a 65 20 69 6e 66 6f 72 6d  e.** size inform
35060 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
35070 63 65 6c 6c 20 69 6e 20 70 49 6e 66 6f 2e 0a 2a  cell in pInfo..*
35080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
35090 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  arCell(.  MemPag
350a0 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
350b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
350c0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
350d0 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   Cell */.  unsig
350e0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
350f0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
35100 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f  e of the Cell */
35110 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
35120 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  fo          /* S
35130 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ize information 
35140 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a  about the cell *
35150 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
35160 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  *pBt;.  Pgno ovf
35170 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
35180 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
35190 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
351a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
351b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
351c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
351d0 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  x) );.  pPage->x
351e0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
351f0 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
35200 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f    if( pInfo->nLo
35210 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79  cal==pInfo->nPay
35220 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75  load ){.    retu
35230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
35240 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
35250 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
35260 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
35270 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74  ng */.  }.  test
35280 63 61 73 65 28 20 70 43 65 6c 6c 20 2b 20 70 49  case( pCell + pI
35290 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 3d 20 70 50  nfo->nSize == pP
352a0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
352b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65  .  testcase( pCe
352c0 6c 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 53 69  ll + (pInfo->nSi
352d0 7a 65 2d 31 29 20 3d 3d 20 70 50 61 67 65 2d 3e  ze-1) == pPage->
352e0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 69 66  aDataEnd );.  if
352f0 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d  ( pCell + pInfo-
35300 3e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e  >nSize > pPage->
35310 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20  aDataEnd ){.    
35320 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
35330 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
35340 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
35350 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
35360 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
35370 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
35380 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e  byte(pCell + pIn
35390 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  fo->nSize - 4);.
353a0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
353b0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  Bt;.  assert( pB
353c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
353d0 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
353e0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
353f0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
35400 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  fl = (pInfo->nPa
35410 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e  yload - pInfo->n
35420 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
35430 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
35440 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
35450 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
35460 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
35470 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
35480 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  d + ovflPageSize
35490 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a  )<ovflPageSize).
354a0 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f    );.  while( nO
354b0 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
354c0 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
354d0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
354e0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
354f0 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
35500 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
35510 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
35520 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
35530 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
35540 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
35550 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
35560 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
35570 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
35580 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
35590 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
355a0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
355b0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
355c0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
355d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
355e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
355f0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
35600 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
35610 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
35620 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
35630 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
35640 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
35650 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
35660 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20     }..    if( ( 
35670 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c  pOvfl || ((pOvfl
35680 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
35690 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  up(pBt, ovflPgno
356a0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26  ))!=0) ).     &&
356b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
356c0 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d  eRefcount(pOvfl-
356d0 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20  >pDbPage)!=1.   
356e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
356f0 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20  re is no reason 
35700 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  any cursor shoul
35710 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61  d have an outsta
35720 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
35730 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20  .      ** to an 
35740 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65  overflow page be
35750 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c  longing to a cel
35760 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  l that is being 
35770 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e  deleted/updated.
35780 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20  .      ** So if 
35790 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72  there exists mor
357a0 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
357b0 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67  ence to this pag
357c0 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20  e, then it .    
357d0 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65    ** must not re
357e0 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66  ally be an overf
357f0 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65  low page and the
35800 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
35810 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20  e corrupt. .    
35820 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66    ** It is helpf
35830 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69  ul to detect thi
35840 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
35850 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73   freePage2(), as
35860 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50   .      ** freeP
35870 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20  age2() may zero 
35880 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
35890 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65  s if secure-dele
358a0 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20  te mode is.     
358b0 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
358c0 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20  this 'overflow' 
358d0 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
358e0 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74  be a page that t
358f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  he.      ** call
35900 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20  er is iterating 
35910 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67  through or using
35920 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77   in some other w
35930 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a  ay, this.      *
35940 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d  * can be problem
35950 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atic..      */. 
35960 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35970 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
35980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35990 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
359a0 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
359b0 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gno);.    }..   
359c0 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
359d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
359e0 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
359f0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
35a00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
35a10 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
35a20 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
35a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35a40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
35a50 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
35a60 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
35a70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
35a80 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
35a90 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
35aa0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
35ab0 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
35ac0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
35ad0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
35ae0 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
35af0 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
35b00 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
35b10 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
35b20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
35b30 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
35b40 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
35b50 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
35b60 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
35b70 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
35b80 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
35b90 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
35ba0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
35bb0 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
35bc0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
35bd0 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
35be0 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
35bf0 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
35c00 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
35c10 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
35c20 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
35c30 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
35c40 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
35c50 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
35c60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35c80 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
35c90 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
35ca0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
35cb0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
35cc0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
35cd0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
35ce0 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
35cf0 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58  BtreePayload *pX
35d00 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c  ,        /* Payl
35d10 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20 74  oad with which t
35d20 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
35d30 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cell */.  int *p
35d40 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
35d50 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
35d60 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
35d70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
35d80 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
35d90 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
35da0 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a  Src, n, rc, mn;.
35db0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
35dc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
35dd0 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73 69 67 6e  elease;.  unsign
35de0 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
35df0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35e00 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
35e10 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50  Shared *pBt;.  P
35e20 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20  gno pgnoOvfl;.  
35e30 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20  int nHeader;..  
35e40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35e50 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
35e60 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
35e70 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
35e80 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
35e90 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
35ea0 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
35eb0 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
35ec0 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
35ed0 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
35ee0 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
35ef0 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
35f00 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
35f10 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
35f20 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
35f30 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
35f40 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
35f50 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
35f60 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
35f70 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
35f80 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
35f90 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
35fa0 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
35fb0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69  hildPtrSize;.  i
35fc0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
35fd0 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   ){.    nPayload
35fe0 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70   = pX->nData + p
35ff0 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53  X->nZero;.    pS
36000 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a  rc = pX->pData;.
36010 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e      nSrc = pX->n
36020 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
36030 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
36040 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e  eaf ); /* fillIn
36050 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c  Cell() only call
36060 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f  ed for leaves */
36070 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
36080 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
36090 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
360a0 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61  yload);.    nHea
360b0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
360c0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
360d0 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b  , *(u64*)&pX->nK
360e0 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
360f0 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b    assert( pX->nK
36100 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26  ey<=0x7fffffff &
36110 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b  & pX->pKey!=0 );
36120 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79  .    nSrc = nPay
36130 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e  load = (int)pX->
36140 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
36150 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e   pX->pKey;.    n
36160 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
36170 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
36180 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
36190 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
361a0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
361b0 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f 61 64 20  d */.  pPayload 
361c0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
361d0 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  ];.  if( nPayloa
361e0 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
361f0 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
36200 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  s is the common 
36210 63 61 73 65 20 77 68 65 72 65 20 65 76 65 72 79  case where every
36220 74 68 69 6e 67 20 66 69 74 73 20 6f 6e 20 74 68  thing fits on th
36230 65 20 62 74 72 65 65 20 70 61 67 65 0a 20 20 20  e btree page.   
36240 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76 65 72 66   ** and no overf
36250 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 72 65  low pages are re
36260 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 6e  quired. */.    n
36270 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
36280 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
36290 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
362a0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
362b0 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
362c0 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
362d0 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 61 73 73  ize = n;.    ass
362e0 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50 61 79 6c  ert( nSrc<=nPayl
362f0 6f 61 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oad );.    testc
36300 61 73 65 28 20 6e 53 72 63 3c 6e 50 61 79 6c 6f  ase( nSrc<nPaylo
36310 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ad );.    memcpy
36320 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
36330 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d 65 6d 73   nSrc);.    mems
36340 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e 53 72 63  et(pPayload+nSrc
36350 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e 53  , 0, nPayload-nS
36360 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
36370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
36380 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
36390 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
363a0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
363b0 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  of the content w
363c0 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f  ill need.  ** to
363d0 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72   spill onto over
363e0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f  flow pages..  */
363f0 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  .  mn = pPage->m
36400 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d  inLocal;.  n = m
36410 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
36420 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
36430 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
36440 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  4);.  testcase( 
36450 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
36460 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
36470 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
36480 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
36490 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  n > pPage->maxLo
364a0 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20  cal ) n = mn;.  
364b0 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
364c0 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e   *pnSize = n + n
364d0 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 70 50  Header + 4;.  pP
364e0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
364f0 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52  eader+n];.  pToR
36500 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 70 67  elease = 0;.  pg
36510 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 70 42  noOvfl = 0;.  pB
36520 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
36530 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
36540 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
36550 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
36560 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
36570 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
36580 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
36590 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
365a0 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
365b0 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
365c0 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
365d0 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
365e0 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
365f0 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
36600 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
36610 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
36620 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
36630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36640 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
36650 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
36660 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
36670 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
36680 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
36690 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
366a0 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
366b0 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
366c0 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
366d0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
366e0 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
366f0 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
36700 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
36710 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
36720 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
36730 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
36740 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
36750 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
36760 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
36770 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
36780 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
36790 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49  UG.  {.    CellI
367a0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50  nfo info;.    pP
367b0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
367c0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
367d0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
367e0 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29  ( nHeader==(int)
367f0 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  (info.pPayload -
36800 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61   pCell) );.    a
36810 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
36820 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  ==pX->nKey );.  
36830 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a    assert( *pnSiz
36840 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20  e == info.nSize 
36850 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
36860 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f  paceLeft == info
36870 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23  .nLocal );.  }.#
36880 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74  endif..  /* Writ
36890 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e  e the payload in
368a0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c  to the local Cel
368b0 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20  l and any extra 
368c0 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
368d0 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ges */.  while( 
368e0 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 50 61  1 ){.    n = nPa
368f0 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
36900 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
36910 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
36920 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
36930 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
36940 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
36950 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
36960 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
36970 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
36980 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
36990 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
369a0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
369b0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
369c0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
369d0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
369e0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
369f0 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
36a00 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
36a10 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
36a20 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
36a30 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
36a40 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
36a50 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
36a60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
36a70 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
36a80 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
36a90 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
36aa0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
36ab0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
36ac0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36ad0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36ae0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
36af0 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 6d  rc>=n ){.      m
36b00 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
36b10 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
36b20 6c 73 65 20 69 66 28 20 6e 53 72 63 3e 30 20 29  lse if( nSrc>0 )
36b30 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e 53 72 63  {.      n = nSrc
36b40 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
36b50 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
36b60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
36b70 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
36b80 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
36b90 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
36ba0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 50 61  = n;.    if( nPa
36bb0 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72 65 61 6b  yload<=0 ) break
36bc0 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
36bd0 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
36be0 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
36bf0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
36c00 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 73   -= n;.    if( s
36c10 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  paceLeft==0 ){. 
36c20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f       MemPage *pO
36c30 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  vfl = 0;.#ifndef
36c40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36c50 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
36c60 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
36c70 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
36c80 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
36c90 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
36ca0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
36cb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
36cc0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
36cd0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
36ce0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
36cf0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
36d00 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
36d10 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
36d20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
36d30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
36d40 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
36d50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
36d60 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
36d70 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
36d80 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
36d90 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
36da0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36db0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
36dc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
36dd0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
36de0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
36df0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
36e00 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
36e10 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
36e20 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
36e30 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
36e40 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
36e50 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
36e60 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
36e70 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
36e80 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
36e90 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
36ea0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
36eb0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
36ec0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
36ed0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
36ee0 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
36ef0 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
36f00 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
36f10 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
36f20 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
36f30 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
36f40 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
36f50 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
36f60 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
36f70 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  he uninitialized
36f80 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
36f90 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
36fa0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
36fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
36fc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
36fd0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
36fe0 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
36ff0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
37000 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
37010 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
37020 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
37030 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
37040 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
37050 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
37060 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
37070 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
37080 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
37090 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
370a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
370b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
370c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
370d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
370e0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
370f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37100 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
37110 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
37120 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
37130 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
37140 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
37150 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
37160 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
37170 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
37180 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
37190 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
371a0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
371b0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
371c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
371d0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
371e0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
371f0 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
37200 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
37210 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
37220 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
37230 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
37240 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
37250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
37260 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
37270 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
37280 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
37290 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
372a0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
372b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
372c0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
372d0 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
372e0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
372f0 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
37300 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
37310 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
37320 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
37330 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
37340 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
37350 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
37360 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
37370 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
37380 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
37390 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
373a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
373b0 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  4;.    }.  }.  r
373c0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
373d0 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
373e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
373f0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
37400 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
37410 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
37420 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
37430 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
37440 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
37450 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
37460 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
37470 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
37480 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
37490 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
374a0 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
374b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
374c0 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
374d0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
374e0 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
374f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
37500 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
37510 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
37520 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
37530 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
37540 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
37550 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
37560 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
37570 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
37580 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
37590 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
375a0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
375b0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
375c0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
375d0 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
375e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
375f0 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
37600 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
37610 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
37620 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
37630 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
37640 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
37650 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
37660 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
37670 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
37680 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
37690 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
376a0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
376b0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
376c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
376d0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
376e0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
376f0 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
37700 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
37710 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
37720 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
37730 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
37740 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
37750 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
37760 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
37770 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
37780 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
37790 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70  lIdx[2*idx];.  p
377a0 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
377b0 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
377c0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
377d0 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
377e0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
377f0 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
37800 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
37810 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
37820 20 29 3b 0a 20 20 69 66 28 20 70 63 2b 73 7a 20   );.  if( pc+sz 
37830 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
37840 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
37850 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
37860 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
37870 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
37880 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
37890 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
378a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
378b0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
378c0 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  rn;.  }.  pPage-
378d0 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20  >nCell--;.  if( 
378e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
378f0 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
37900 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
37910 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
37920 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32  7] = 0;.    put2
37930 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
37940 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ], pPage->pBt->u
37950 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
37960 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
37970 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
37980 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68  eSize - pPage->h
37990 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20  drOffset.       
379a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379b0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
379c0 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c  rSize - 8;.  }el
379d0 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  se{.    memmove(
379e0 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
379f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
37a00 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  x));.    put2byt
37a10 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
37a20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
37a30 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
37a40 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  += 2;.  }.}../*.
37a50 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
37a60 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
37a70 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
37a80 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
37a90 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
37aa0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
37ab0 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
37ac0 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
37ad0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
37ae0 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
37af0 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
37b00 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
37b10 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
37b20 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
37b30 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
37b40 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
37b50 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
37b60 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
37b70 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
37b80 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  in pPage->apOvfl
37b90 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
37ba0 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
37bb0 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
37bc0 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
37bd0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
37be0 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
37bf0 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
37c00 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
37c10 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
37c20 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
37c30 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
37c40 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
37c50 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
37c60 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20 62 65  .** *pRC must be
37c70 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
37c80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
37c90 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
37ca0 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
37cb0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
37cc0 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
37cd0 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
37ce0 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
37cf0 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
37d00 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
37d10 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
37d20 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
37d30 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
37d40 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
37d50 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
37d60 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
37d70 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
37d80 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
37d90 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
37da0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
37db0 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
37dc0 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
37dd0 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
37de0 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
37df0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
37e00 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
37e10 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
37e20 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
37e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
37e40 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
37e50 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
37e60 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
37e70 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
37e80 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
37e90 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
37ea0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
37eb0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
37ec0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
37ed0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
37ee0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
37ef0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
37f00 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
37f10 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f  *pIns;         /
37f20 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70  * The point in p
37f30 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d  Page->aCellIdx[]
37f40 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69   where no cell i
37f50 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73  nserted */..  as
37f60 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49  sert( *pRC==SQLI
37f70 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
37f80 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
37f90 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
37fa0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
37fb0 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
37fc0 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
37fd0 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  921 );.  assert(
37fe0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
37ff0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
38000 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  t) || CORRUPT_DB
38010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
38020 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
38030 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
38040 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >apOvfl) );.  as
38050 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
38060 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d  pPage->apOvfl)==
38070 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
38080 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >aiOvfl) );.  as
38090 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
380a0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
380b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
380c0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f   /* The cell sho
380d0 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
380e0 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  sized correctly.
380f0 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20    However, when 
38100 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61  moving a.  ** ma
38110 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f  lformed cell fro
38120 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f  m a leaf page to
38130 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   an interior pag
38140 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73  e, if the cell s
38150 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20  ize.  ** wanted 
38160 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
38170 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65  4 but got rounde
38180 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65  d up to 4 on the
38190 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65   leaf, then size
381a0 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c  .  ** might be l
381b0 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66  ess than 8 (leaf
381c0 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29  -size + pointer)
381d0 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72   on the interior
381e0 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20   node.  Hence.  
381f0 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65  ** the term afte
38200 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20  r the || in the 
38210 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
38220 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
38230 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c   sz==pPage->xCel
38240 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65  lSize(pPage, pCe
38250 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
38260 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
38270 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
38280 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
38290 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
382a0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
382b0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
382c0 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
382d0 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
382e0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
382f0 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
38300 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
38310 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
38320 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
38330 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
38340 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 67  /* Comparison ag
38350 61 69 6e 73 74 20 41 72 72 61 79 53 69 7a 65 2d  ainst ArraySize-
38360 31 20 73 69 6e 63 65 20 77 65 20 68 6f 6c 64 20  1 since we hold 
38370 62 61 63 6b 20 6f 6e 65 20 65 78 74 72 61 20 73  back one extra s
38380 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  lot.    ** as a 
38390 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20 49 6e  contingency.  In
383a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6e 65   other words, ne
383b0 76 65 72 20 6e 65 65 64 20 6d 6f 72 65 20 74 68  ver need more th
383c0 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a 20 20  an 3 overflow.  
383d0 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74 20 34    ** slots but 4
383e0 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20   are allocated, 
383f0 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
38400 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
38410 6a 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 50  j < ArraySize(pP
38420 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31 20 29  age->apOvfl)-1 )
38430 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
38440 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
38450 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
38460 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a  l[j] = (u16)i;..
38470 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74      /* When mult
38480 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f  iple overflows o
38490 63 63 75 72 2c 20 74 68 65 79 20 61 72 65 20