/ Hex Artifact Content
Login

Artifact 5a6023e4cbf2425d6cf45adb7736083ba72c98cb07b507801327246fdff6eea6:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  , b) 0.#endif../
0f60: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0f70: 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
0f80: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 29  E_CORRUPT_PAGE()
0f90: 20 6d 61 63 72 6f 2e 20 54 61 6b 65 73 20 61 20   macro. Takes a 
0fa0: 73 69 6e 67 6c 65 0a 2a 2a 20 28 4d 65 6d 50 61  single.** (MemPa
0fb0: 67 65 2a 29 20 61 73 20 61 6e 20 61 72 67 75 6d  ge*) as an argum
0fc0: 65 6e 74 2e 20 54 68 65 20 28 4d 65 6d 50 61 67  ent. The (MemPag
0fd0: 65 2a 29 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  e*) must not be 
0fe0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  NULL..**.** If S
0ff0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 6e  QLITE_DEBUG is n
1000: 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  ot defined, then
1010: 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 65   this macro is e
1020: 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 2a 2a 20  quivalent to.** 
1030: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1040: 4b 50 54 2e 20 4f 72 2c 20 69 66 20 53 51 4c 49  KPT. Or, if SQLI
1050: 54 45 5f 44 45 42 55 47 20 69 73 20 73 65 74 2c  TE_DEBUG is set,
1060: 20 74 68 65 6e 20 74 68 65 20 6c 6f 67 20 6d 65   then the log me
1070: 73 73 61 67 65 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  ssage.** normall
1080: 79 20 70 72 6f 64 75 63 65 64 20 61 73 20 61 20  y produced as a 
1090: 73 69 64 65 2d 65 66 66 65 63 74 20 6f 66 20 53  side-effect of S
10a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10b0: 50 54 20 69 73 20 61 75 67 6d 65 6e 74 65 64 0a  PT is augmented.
10c0: 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
10d0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 66 69 6c 65   number and file
10e0: 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20  name associated 
10f0: 77 69 74 68 20 74 68 65 20 28 4d 65 6d 50 61 67  with the (MemPag
1100: 65 2a 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  e*)..*/.#ifdef S
1110: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
1120: 63 6f 72 72 75 70 74 50 61 67 65 45 72 72 6f 72  corruptPageError
1130: 28 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 4d 65 6d  (int lineno, Mem
1140: 50 61 67 65 20 2a 70 29 7b 0a 20 20 63 68 61 72  Page *p){.  char
1150: 20 2a 7a 4d 73 67 3b 0a 20 20 73 71 6c 69 74 65   *zMsg;.  sqlite
1160: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1170: 6f 63 28 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73  oc();.  zMsg = s
1180: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1190: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
11a0: 69 6f 6e 20 70 61 67 65 20 25 64 20 6f 66 20 25  ion page %d of %
11b0: 73 22 2c 0a 20 20 20 20 20 20 28 69 6e 74 29 70  s",.      (int)p
11c0: 2d 3e 70 67 6e 6f 2c 20 73 71 6c 69 74 65 33 50  ->pgno, sqlite3P
11d0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
11e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 0a  pBt->pPager, 0).
11f0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e    );.  sqlite3En
1200: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1210: 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a 20  .  if( zMsg ){. 
1220: 20 20 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74     sqlite3Report
1230: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52  Error(SQLITE_COR
1240: 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 4d  RUPT, lineno, zM
1250: 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  sg);.  }.  sqlit
1260: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
1270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1280: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 23  ORRUPT_BKPT;.}.#
1290: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43   define SQLITE_C
12a0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d 65 6d  ORRUPT_PAGE(pMem
12b0: 50 61 67 65 29 20 63 6f 72 72 75 70 74 50 61 67  Page) corruptPag
12c0: 65 45 72 72 6f 72 28 5f 5f 4c 49 4e 45 5f 5f 2c  eError(__LINE__,
12d0: 20 70 4d 65 6d 50 61 67 65 29 0a 23 65 6c 73 65   pMemPage).#else
12e0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
12f0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d  _CORRUPT_PAGE(pM
1300: 65 6d 50 61 67 65 29 20 53 51 4c 49 54 45 5f 43  emPage) SQLITE_C
1310: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 4d 65 6d  ORRUPT_PGNO(pMem
1320: 50 61 67 65 2d 3e 70 67 6e 6f 29 0a 23 65 6e 64  Page->pgno).#end
1330: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1340: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1350: 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53 51 4c  ACHE..#ifdef SQL
1360: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1380: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
1390: 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72  part of an asser
13a0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  t() statement. *
13b0: 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  **.**.** Check t
13c0: 6f 20 73 65 65 20 69 66 20 70 42 74 72 65 65 20  o see if pBtree 
13d0: 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69 72  holds the requir
13e0: 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61 64  ed locks to read
13f0: 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
1400: 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74 68 20   .** table with 
1410: 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 2e  root page iRoot.
1420: 20 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69     Return 1 if i
1430: 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69 66 20  t does and 0 if 
1440: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  not..**.** For e
1450: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69  xample, when wri
1460: 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
1470: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
1480: 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42 74 72  Root via .** Btr
1490: 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42  ee connection pB
14a0: 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  tree:.**.**    a
14b0: 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
14c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
14d0: 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c  Btree, iRoot, 0,
14e0: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a   WRITE_LOCK) );.
14f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69 74 69  **.** When writi
1500: 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 74  ng to an index t
1510: 68 61 74 20 72 65 73 69 64 65 73 20 69 6e 20 61  hat resides in a
1520: 20 73 68 61 72 61 62 6c 65 20 64 61 74 61 62 61   sharable databa
1530: 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  se, the .** call
1540: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66  er should have f
1550: 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20 61 20  irst obtained a 
1560: 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e 67 20  lock specifying 
1570: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1580: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
1590: 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54 68 69  nding table. Thi
15a0: 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 61  s makes things a
15b0: 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70 6c 69   bit more compli
15c0: 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74 68 69  cated,.** as thi
15d0: 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74 73 20  s module treats 
15e0: 65 61 63 68 20 74 61 62 6c 65 20 61 73 20 61 20  each table as a 
15f0: 73 65 70 61 72 61 74 65 20 73 74 72 75 63 74 75  separate structu
1600: 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69 6e 65  re. To determine
1610: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f  .** the table co
1620: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
1630: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 77  he index being w
1640: 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a 2a 20  ritten, this.** 
1650: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20  function has to 
1660: 73 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74  search through t
1670: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1680: 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ma..**.** Instea
1690: 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  d of a lock on t
16a0: 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 72  he table/index r
16b0: 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52  ooted at page iR
16c0: 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  oot, the caller 
16d0: 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72  may.** hold a wr
16e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
16f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28 72 6f  schema table (ro
1700: 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68 69 73  ot page 1). This
1710: 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65   is also.** acce
1720: 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ptable..*/.stati
1730: 63 20 69 6e 74 20 68 61 73 53 68 61 72 65 64 43  c int hasSharedC
1740: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20  acheTableLock(. 
1750: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
1760: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1770: 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f 6c 64  e that must hold
1780: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20   lock */.  Pgno 
1790: 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iRoot,          
17a0: 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
17b0: 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  f b-tree */.  in
17c0: 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20 20 20  t isIndex,      
17d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17e0: 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f  iRoot is the roo
17f0: 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 62 2d  t of an index b-
1800: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c  tree */.  int eL
1810: 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20 20 20  ockType         
1820: 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c 6f 63   /* Required loc
1830: 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c 4f 43  k type (READ_LOC
1840: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
1850: 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20   */.){.  Schema 
1860: 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63 68 65  *pSchema = (Sche
1870: 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70 42 74  ma *)pBtree->pBt
1880: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e  ->pSchema;.  Pgn
1890: 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20 42 74  o iTab = 0;.  Bt
18a0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20  Lock *pLock;..  
18b0: 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
18c0: 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61 72 65  ase is not share
18d0: 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68 65 20  able, or if the 
18e0: 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e  client is readin
18f0: 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73 20 74  g.  ** and has t
1900: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
1910: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1920: 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20 72 65  en no lock is re
1930: 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20 52 65  quired. .  ** Re
1940: 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65 64 69  turn true immedi
1950: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
1960: 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61  ( (pBtree->shara
1970: 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65  ble==0).   || (e
1980: 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c  LockType==READ_L
1990: 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e  OCK && (pBtree->
19a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29  TE_ReadUncommit)
19c0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
19d0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
19e0: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
19f0: 72 65 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74  reading  or writ
1a00: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ing an index and
1a10: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20   the schema is. 
1a20: 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20   ** not loaded, 
1a30: 74 68 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64  then it is too d
1a40: 69 66 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75  ifficult to actu
1a50: 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65  ally check to se
1a60: 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e if.  ** the co
1a70: 72 72 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20  rrect locks are 
1a80: 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  held.  So do not
1a90: 20 62 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72   bother - just r
1aa0: 65 74 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a  eturn true..  **
1ab0: 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73 20   This case does 
1ac0: 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79  not come up very
1ad0: 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20   often anyhow.. 
1ae0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65   */.  if( isInde
1af0: 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c  x && (!pSchema |
1b00: 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  | (pSchema->sche
1b10: 6d 61 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  maFlags&DB_Schem
1b20: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1b30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b40: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
1b50: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
1b60: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
1b70: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
1b80: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
1b90: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
1ba0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1bb0: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1bc0: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1bd0: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1be0: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1bf0: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1c00: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1c10: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1c20: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1c30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1c40: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
1c50: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
1c60: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
1c70: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
1c80: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
1c90: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1ca0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1cb0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1cd0: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1ce0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
1cf0: 20 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20   iTab ){.       
1d00: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
1d10: 65 20 69 6e 64 65 78 65 73 20 73 68 61 72 65 20  e indexes share 
1d20: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1d30: 67 65 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a  ge.  There must.
1d40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
1d50: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
1d60: 20 20 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e    So just return
1d70: 20 74 72 75 65 2e 20 20 54 68 65 20 61 73 73 65   true.  The asse
1d80: 72 74 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  rt is not.      
1d90: 20 20 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e      ** useful in
1da0: 20 74 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20   that case. */. 
1db0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1dc0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1dd0: 20 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78       iTab = pIdx
1de0: 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a  ->pTable->tnum;.
1df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20  }else{.    iTab 
1e10: 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20  = iRoot;.  }..  
1e20: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
1e30: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1e40: 20 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d   Either a write-
1e50: 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67  lock on root-pag
1e60: 65 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20  e iTab, a .  ** 
1e70: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1e80: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20  e schema table, 
1e90: 6f 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e  or (if the clien
1ea0: 74 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a  t is reading) a.
1eb0: 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f    ** read-lock o
1ec0: 6e 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66  n iTab will suff
1ed0: 69 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66  ice. Return 1 if
1ee0: 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72   any of these ar
1ef0: 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66  e found.  */.  f
1f00: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d  or(pLock=pBtree-
1f10: 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  >pBt->pLock; pLo
1f20: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
1f30: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1f40: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
1f50: 70 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20  pBtree .     && 
1f60: 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d  (pLock->iTable==
1f70: 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e  iTab || (pLock->
1f80: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f90: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  K && pLock->iTab
1fa0: 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20  le==1)).     && 
1fb0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  pLock->eLock>=eL
1fc0: 6f 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a  ockType .    ){.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ff0: 46 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74  Failed to find t
2000: 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
2010: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  . */.  return 0;
2020: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2030: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
2040: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2050: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
2060: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75  unction may be u
2070: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
2080: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
2090: 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a  ts only. ****.**
20a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
20b0: 69 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  if it would be i
20c0: 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65  llegal for pBtre
20d0: 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
20e0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  the.** table or 
20f0: 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20  index rooted at 
2100: 69 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74  iRoot because ot
2110: 68 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  her shared conne
2120: 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69  ctions are.** si
2130: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61  multaneously rea
2140: 64 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74  ding that same t
2150: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  able or index..*
2160: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
2170: 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f  al for pBtree to
2180: 20 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f   write if some o
2190: 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63  ther Btree objec
21a0: 74 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73  t that.** shares
21b0: 20 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72   the same BtShar
21c0: 65 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72  ed object is cur
21d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
21e0: 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  r writing.** the
21f0: 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45   iRoot table.  E
2200: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74  xcept, if the ot
2210: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
2220: 20 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64   has the.** read
2230: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
2240: 67 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69  g set, then it i
2250: 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68  s OK for the oth
2260: 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  er object to.** 
2270: 68 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73  have a read curs
2280: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  or..**.** For ex
2290: 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72  ample, before wr
22a0: 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72  iting to any par
22b0: 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  t of the table o
22c0: 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65  r index.** roote
22d0: 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c  d at page iRoot,
22e0: 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c   one should call
22f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72  :.**.**    asser
2300: 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  t( !hasReadConfl
2310: 69 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f  icts(pBtree, iRo
2320: 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  ot) );.*/.static
2330: 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66   int hasReadConf
2340: 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74  licts(Btree *pBt
2350: 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29  ree, Pgno iRoot)
2360: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
2370: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
2380: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
2390: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
23a0: 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
23b0: 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20  ot==iRoot .     
23c0: 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42  && p->pBtree!=pB
23d0: 74 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d  tree.     && 0==
23e0: 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  (p->pBtree->db->
23f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
2400: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a 20 20 20  eadUncommit).   
2410: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2420: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2430: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
2440: 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20  if    /* #ifdef 
2450: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
2460: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
2470: 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61 6e  see if Btree han
2480: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
2490: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
24a0: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
24b0: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
24c0: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
24d0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
24e0: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
24f0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2500: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
2510: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
2520: 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61  g.** setSharedCa
2530: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c  cheTableLock()),
2540: 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   or SQLITE_LOCKE
2550: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
2560: 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61  tic int querySha
2570: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2580: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2590: 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29   iTab, u8 eLock)
25a0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
25b0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
25c0: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
25d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
25e0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
25f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2600: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2610: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2620: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
2630: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  ( p->db!=0 );.  
2640: 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d  assert( !(p->db-
2650: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2660: 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c 65 4c 6f  adUncommit)||eLo
2670: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c  ck==WRITE_LOCK||
2680: 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  iTab==1 );.  .  
2690: 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67  /* If requesting
26a0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74   a write-lock, t
26b0: 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75  hen the Btree mu
26c0: 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  st have an open 
26d0: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
26e0: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66  action on this f
26f0: 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75  ile. And, obviou
2700: 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f  sly, for this to
2710: 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20   be so there .  
2720: 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  ** must be an op
2730: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
2740: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65  tion on the file
2750: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
2760: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2770: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d  EAD_LOCK || (p==
2780: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20  pBt->pWriter && 
2790: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
27a0: 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73  S_WRITE) );.  as
27b0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
27c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69  D_LOCK || pBt->i
27d0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
27e0: 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a  ANS_WRITE );.  .
27f0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2800: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  e is a no-op if 
2810: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
2820: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
2830: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
2840: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
2850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2860: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
2870: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2880: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
2890: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
28a0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
28b0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
28c0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
28d0: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
28e0: 69 74 65 72 21 3d 70 20 26 26 20 28 70 42 74 2d  iter!=p && (pBt-
28f0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
2900: 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 7b  EXCLUSIVE)!=0 ){
2910: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
2920: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
2930: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
2940: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
2950: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2960: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2970: 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  }..  for(pIter=p
2980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
2990: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
29a0: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Next){.    /* Th
29b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74  e condition (pIt
29c0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
29d0: 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ) in the followi
29e0: 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20  ng if(...) .    
29f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ** statement is 
2a00: 61 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  a simplification
2a10: 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2a20: 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49  **   (eLock==WRI
2a30: 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  TE_LOCK || pIter
2a40: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
2a50: 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  OCK).    **.    
2a60: 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
2a70: 20 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d   that if eLock==
2a80: 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e  WRITE_LOCK, then
2a90: 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2aa0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20  tion.    ** may 
2ab0: 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43  hold a WRITE_LOC
2ac0: 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69  K on any table i
2ad0: 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e  n this file (sin
2ae0: 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20  ce there can.   
2af0: 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69   ** only be a si
2b00: 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20  ngle writer)..  
2b10: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2b20: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
2b30: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
2b40: 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  r->eLock==WRITE_
2b50: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
2b60: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
2b70: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70  LOCK || pIter->p
2b80: 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65  Btree==p || pIte
2b90: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2ba0: 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49  OCK);.    if( pI
2bb0: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
2bc0: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
2bd0: 3d 69 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e  =iTab && pIter->
2be0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a  eLock!=eLock ){.
2bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
2c00: 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
2c10: 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74  ->db, pIter->pBt
2c20: 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  ree->db);.      
2c30: 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45  if( eLock==WRITE
2c40: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
2c50: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d   assert( p==pBt-
2c60: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
2c70: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
2c80: 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47  s |= BTS_PENDING
2c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2cb0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
2cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ce0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2cf0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2d00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2d10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2d20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2d30: 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   Add a lock on t
2d40: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2d50: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74  ot-page iTable t
2d60: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
2d70: 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74  ee used.** by Bt
2d80: 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61  ree handle p. Pa
2d90: 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75  rameter eLock mu
2da0: 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45 41  st be either REA
2db0: 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52  D_LOCK or .** WR
2dc0: 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ITE_LOCK..**.** 
2dd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2de0: 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sumes the follow
2df0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29  ing:.**.**   (a)
2e00: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 42   The specified B
2e10: 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69 73  tree object p is
2e20: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
2e30: 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20  sharable.**     
2e40: 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65 20    database (one 
2e50: 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72 65  with the BtShare
2e60: 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67 20  d.sharable flag 
2e70: 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  set), and.**.** 
2e80: 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20 42    (b) No other B
2e90: 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c  tree objects hol
2ea0: 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f  d a lock that co
2eb0: 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20 20  nflicts.**      
2ec0: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73   with the reques
2ed0: 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71  ted lock (i.e. q
2ee0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2ef0: 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a  ableLock() has.*
2f00: 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20  *       already 
2f10: 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20  been called and 
2f20: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
2f30: 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OK)..**.** SQLIT
2f40: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2f50: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
2f60: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
2f70: 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ly. SQLITE_NOMEM
2f80: 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64   .** is returned
2f90: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74   if a malloc att
2fa0: 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  empt fails..*/.s
2fb0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
2fc0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2fd0: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2fe0: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
2ff0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
3000: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
3010: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3020: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
3030: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
3040: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3050: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
3060: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
3070: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
3080: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
3090: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
30a0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e  0 );..  /* A con
30b0: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  nection with the
30c0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
30d0: 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20  d flag set will 
30e0: 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a  never try to.  *
30f0: 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d  * obtain a read-
3100: 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20  lock using this 
3110: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e  function. The on
3120: 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74  ly read-lock obt
3130: 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20  ained.  ** by a 
3140: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65  connection in re
3150: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d  ad-uncommitted m
3160: 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71  ode is on the sq
3170: 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a  lite_master .  *
3180: 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61  * table, and tha
3190: 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  t lock is obtain
31a0: 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e  ed in BtreeBegin
31b0: 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61  Trans().  */.  a
31c0: 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62  ssert( 0==(p->db
31d0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
31e0: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20 7c 7c 20  eadUncommit) || 
31f0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
3200: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
3210: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
3220: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
3230: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
3240: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
3250: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
3260: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
3270: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
3280: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
3290: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
32a0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
32b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
32c0: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
32d0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
32e0: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
32f0: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
3300: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
3310: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
3320: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
3330: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
3340: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
3350: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
3360: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
3370: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
3380: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
3390: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
33a0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
33b0: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
33c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
33d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
33e0: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
33f0: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
3400: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
3410: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
3420: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
3430: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
3440: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
3450: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
3460: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
3470: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
3480: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
3490: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
34a0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
34b0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
34c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34d0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
34e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
34f0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
3500: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
3510: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
3520: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
3530: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
3540: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
3550: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
3560: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
3570: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
3580: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3590: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
35a0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
35b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
35c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
35d0: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
35e0: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
35f0: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
3600: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
3610: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
3620: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
3630: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
3640: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
3650: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
3660: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
3670: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
3680: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
3690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
36a0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
36b0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
36c0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
36d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
36e0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
36f0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
3700: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
3710: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
3720: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
3730: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
3740: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
3750: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
3760: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
3770: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
3780: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
3790: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
37a0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
37b0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37c0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
37d0: 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44  hen the BTS_PEND
37e0: 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20  ING flag.** may 
37f0: 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63  be incorrectly c
3800: 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
3810: 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53  c void clearAllS
3820: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
3830: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
3840: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3850: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
3860: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
3870: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73  Bt->pLock;..  as
3880: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
3890: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
38a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
38b0: 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a  sharable || 0==*
38c0: 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65  ppIter );.  asse
38d0: 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30  rt( p->inTrans>0
38e0: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
38f0: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
3900: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
3910: 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
3920: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
3930: 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45   & BTS_EXCLUSIVE
3940: 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72  )==0 || pBt->pWr
3950: 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  iter==pLock->pBt
3960: 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ree );.    asser
3970: 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  t( pLock->pBtree
3980: 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b  ->inTrans>=pLock
3990: 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69  ->eLock );.    i
39a0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
39b0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
39c0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
39d0: 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
39e0: 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  t( pLock->iTable
39f0: 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70  !=1 || pLock==&p
3a00: 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  ->lock );.      
3a10: 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  if( pLock->iTabl
3a20: 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=1 ){.        
3a30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f  sqlite3_free(pLo
3a40: 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ck);.      }.   
3a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
3a60: 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70  Iter = &pLock->p
3a70: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
3a80: 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
3a90: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
3aa0: 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70  PENDING)==0 || p
3ab0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
3ac0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3ad0: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d  r==p ){.    pBt-
3ae0: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3af0: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3b00: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3b10: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3b20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74  .  }else if( pBt
3b30: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
3b40: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  2 ){.    /* This
3b50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3b60: 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70  led when Btree p
3b70: 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69   is concluding i
3b80: 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ts .    ** trans
3b90: 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65  action. If there
3ba0: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
3bb0: 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20  s a writer, and 
3bc0: 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  p is not.    ** 
3bd0: 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65  that writer, the
3be0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3bf0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
3c00: 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a  nnections other.
3c10: 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20      ** than the 
3c20: 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61  writer must be a
3c30: 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20  bout to drop to 
3c40: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
3c50: 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  se.    ** set th
3c60: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3c70: 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a  ag to 0..    **.
3c80: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
3c90: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
3ca0: 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20   a writer, then 
3cb0: 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74  BTS_PENDING must
3cc0: 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20  .    ** be zero 
3cd0: 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73  already. So this
3ce0: 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61   next line is ha
3cf0: 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63  rmless in that c
3d00: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
3d10: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
3d20: 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20   ~BTS_PENDING;. 
3d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3d40: 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65   function change
3d50: 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  s all write-lock
3d60: 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  s held by Btree 
3d70: 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b  p into read-lock
3d80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3d90: 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  d downgradeAllSh
3da0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3db0: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
3dc0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
3dd0: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70   p->pBt;.  if( p
3de0: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3df0: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  {.    BtLock *pL
3e00: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57  ock;.    pBt->pW
3e10: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3e20: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3e30: 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c  ~(BTS_EXCLUSIVE|
3e40: 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20  BTS_PENDING);.  
3e50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d    for(pLock=pBt-
3e60: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
3e70: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
3e80: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
3e90: 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d  ( pLock->eLock==
3ea0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  READ_LOCK || pLo
3eb0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b  ck->pBtree==p );
3ec0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c  .      pLock->eL
3ed0: 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
3ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65  .    }.  }.}..#e
3ef0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
3f00: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
3f10: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
3f20: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
3f30: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 20  Page *pPage);   
3f40: 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72 64        /* Forward
3f50: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3f60: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
3f70: 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
3f80: 20 2a 70 50 61 67 65 29 3b 20 20 20 20 20 20 2f   *pPage);      /
3f90: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
3fa0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
3fb0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
3fc0: 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
3fd0: 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61  Page);  /* Forwa
3fe0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
3ff0: 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72  ./*.***** This r
4000: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69  outine is used i
4010: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
4020: 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a  ) only ****.**.*
4030: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
4040: 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74  e cursor holds t
4050: 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20  he mutex on its 
4060: 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64  BtShared.*/.#ifd
4070: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4080: 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f  static int curso
4090: 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75  rHoldsMutex(BtCu
40a0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  rsor *p){.  retu
40b0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
40c0: 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
40d0: 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69  tex);.}../* Veri
40e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
40f0: 6f 72 20 61 6e 64 20 74 68 65 20 42 74 53 68 61  or and the BtSha
4100: 72 65 64 20 61 67 72 65 65 20 61 62 6f 75 74 20  red agree about 
4110: 77 68 61 74 20 69 73 20 74 68 65 20 63 75 72 72  what is the curr
4120: 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
4130: 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20  connetion. This 
4140: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20  is important in 
4150: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
4160: 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e. If the databa
4170: 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  se .** connectio
4180: 6e 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f  n pointers get o
4190: 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69  ut-of-sync, it i
41a0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  s possible for r
41b0: 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20  outines like.** 
41c0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
41d0: 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20  to reference an 
41e0: 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  stale connection
41f0: 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65   pointer that re
4200: 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20  ferences a.** a 
4210: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
4220: 68 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73  has already clos
4230: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
4240: 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  e is used inside
4250: 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
4260: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64  tements only and
4270: 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
4280: 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   of double-check
4290: 69 6e 67 20 74 68 61 74 20 74 68 65 20 62 74 72  ing that the btr
42a0: 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20  ee code.** does 
42b0: 6b 65 65 70 20 74 68 65 20 64 61 74 61 62 61 73  keep the databas
42c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69  e connection poi
42d0: 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65  nters up-to-date
42e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
42f0: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
4300: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ed(BtCursor *p){
4310: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
4320: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  rHoldsMutex(p) )
4330: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  ;.  return (p->p
4340: 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42  Btree->db==p->pB
4350: 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  t->db);.}.#endif
4360: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
4370: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
4380: 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72  cache of the cur
4390: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
43a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
43b0: 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  ..** on the shar
43c0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
43d0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69  re pBt..*/.#defi
43e0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  ne invalidateOve
43f0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
4400: 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
4410: 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
4420: 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  vfl)../*.** Inva
4430: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
4440: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
4450: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
4460: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
4470: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
4480: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
4490: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
44a0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
44b0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
44c0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
44d0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
44e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
44f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
4500: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
4510: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
4520: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
4530: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4540: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
4550: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4560: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
4570: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4580: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
4590: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
45a0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
45b0: 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76   table.** to inv
45c0: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
45d0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
45e0: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
45f0: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
4600: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
4610: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
4620: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
4630: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
4640: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
4650: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
4660: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
4670: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
4680: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
4690: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
46a0: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
46b0: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
46c0: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
46d0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
46e0: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
46f0: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
4700: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
4710: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
4720: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
4730: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
4740: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
4750: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
4760: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
4770: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
4780: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
4790: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
47a0: 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f  that specific ro
47b0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
47c0: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
47d0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
47e0: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
47f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
4800: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
4810: 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  heck */.  Pgno p
4820: 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  gnoRoot,        
4830: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
4840: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
4850: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69  nging */.  i64 i
4860: 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  Row,            
4870: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
4880: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
4890: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  anging */.  int 
48a0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20  isClearTable    
48b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
48c0: 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e  ll rows are bein
48d0: 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  g deleted */.){.
48e0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
48f0: 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73   if( pBtree->has
4900: 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29  IncrblobCur==0 )
4910: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4920: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
4930: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
4940: 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68  ) );.  pBtree->h
4950: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
4960: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  0;.  for(p=pBtre
4970: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
4980: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
4990: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72  .    if( (p->cur
49a0: 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63  Flags & BTCF_Inc
49b0: 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20  rblob)!=0 ){.   
49c0: 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e     pBtree->hasIn
49d0: 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20  crblobCur = 1;. 
49e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
49f0: 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20 26  Root==pgnoRoot &
4a00: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
4a10: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
4a20: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
4a30: 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
4a40: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
4a50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4a60: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
4a70: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
4a80: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
4a90: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
4aa0: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
4ab0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c  blobCursors(w,x,
4ac0: 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
4ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
4ae0: 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  LOB */../*.** Se
4af0: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
4b00: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4b10: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
4b20: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
4b30: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
4b40: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
4b50: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
4b60: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
4b70: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
4b80: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
4b90: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4ba0: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
4bb0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
4bc0: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
4bd0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
4be0: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
4bf0: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
4c00: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
4c10: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
4c20: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
4c30: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
4c40: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
4c50: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
4c60: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
4c70: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
4c80: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
4c90: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
4ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
4cb0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
4cc0: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
4cd0: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
4ce0: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
4cf0: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
4d00: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
4d10: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
4d20: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
4d30: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
4d40: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
4d50: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
4d60: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
4d70: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
4d80: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4d90: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
4da0: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
4db0: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
4dc0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
4dd0: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
4de0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
4df0: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
4e00: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
4e10: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
4e20: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
4e30: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
4e40: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
4e50: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
4e60: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
4e70: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
4e80: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
4e90: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
4ea0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
4eb0: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4ec0: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4ed0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4ee0: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4ef0: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
4f00: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
4f10: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
4f20: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
4f30: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4f40: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
4f50: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4f60: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4f70: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4f80: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4f90: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4fa0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4fb0: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4fc0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4fd0: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4fe0: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4ff0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
5000: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
5010: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
5020: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
5030: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
5040: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
5050: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
5060: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
5070: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
5080: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
5090: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
50a0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
50b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
50c0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
50d0: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
50e0: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
50f0: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
5100: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
5110: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
5120: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
5130: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
5140: 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  s omitted if the
5150: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
5160: 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  it is already.**
5170: 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64   set in BtShared
5180: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68  .pHasContent. Th
5190: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
51a0: 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65  e bitvec are cle
51b0: 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65  ared.** at the e
51c0: 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e  nd of every tran
51d0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
51e0: 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48  ic int btreeSetH
51f0: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
5200: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
5210: 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  no){.  int rc = 
5220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
5230: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
5240: 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
5250: 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61  ( pgno<=pBt->nPa
5260: 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge );.    pBt->p
5270: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
5280: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
5290: 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  (pBt->nPage);.  
52a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
52b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
52c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
52d0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
52e0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
52f0: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
5300: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
5310: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
5320: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
5330: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
5340: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
5350: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
5360: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5370: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
5380: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
5390: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
53a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
53b0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
53c0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
53d0: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
53e0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
53f0: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
5400: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
5410: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
5420: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
5430: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
5440: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
5450: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
5460: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
5470: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
5480: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
5490: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
54a0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
54b0: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
54c0: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
54d0: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
54e0: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
54f0: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
5500: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
5510: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
5520: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
5530: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
5540: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
5550: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
5560: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
5570: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
5580: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
5590: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
55a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
55b0: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
55c0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
55d0: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
55e0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
55f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
5600: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
5610: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
5620: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
5630: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
5640: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
5650: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
5660: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
5670: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 43 75  int i;.  if( pCu
56a0: 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
56b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
56c0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
56d0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
56e0: 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
56f0: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
5700: 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
5710: 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70  eNotNull(pCur->p
5720: 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
5730: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 7d  >iPage = -1;.  }
5740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
5750: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
5760: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5770: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
5780: 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20   valid entry.** 
5790: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
57a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e  on is called (i.
57b0: 65 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d  e. have eState==
57c0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54  CURSOR_VALID). T
57d0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
57e0: 73 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e  saves the curren
57f0: 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20  t cursor key in 
5800: 76 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e  variables pCur->
5810: 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72  nKey and.** pCur
5820: 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f  ->pKey. SQLITE_O
5830: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
5840: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
5850: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a  n SQLite error .
5860: 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
5870: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5880: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5890: 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  n an intkey tabl
58a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  e, then the inte
58b0: 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20  ger key.** (the 
58c0: 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64  rowid) is stored
58d0: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61   in pCur->nKey a
58e0: 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  nd pCur->pKey is
58f0: 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20   left set to.** 
5900: 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72  NULL. If the cur
5910: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
5920: 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c   non-intkey tabl
5930: 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b  e, then pCur->pK
5940: 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f  ey is .** set to
5950: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c   point to a mall
5960: 6f 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72  oced buffer pCur
5970: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20  ->nKey bytes in 
5980: 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
5990: 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a  .** the key..*/.
59a0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
59b0: 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f  ursorKey(BtCurso
59c0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
59d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
59e0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
59f0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
5a00: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5a10: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5a30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5a40: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5a50: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5a60: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  .    /* Only the
5a70: 20 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72   rowid is requir
5a80: 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  ed for a table b
5a90: 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72  tree */.    pCur
5aa0: 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ->nKey = sqlite3
5ab0: 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
5ac0: 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
5ad0: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
5ae0: 64 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20  dex btree, save 
5af0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79  the complete key
5b00: 20 63 6f 6e 74 65 6e 74 2e 20 49 74 20 69 73 20   content. It is 
5b10: 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20  possible.    ** 
5b20: 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  that the current
5b30: 20 6b 65 79 20 69 73 20 63 6f 72 72 75 70 74 2e   key is corrupt.
5b40: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 69   In that case, i
5b50: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
5b60: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71  at.    ** the sq
5b70: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
5b80: 6e 70 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  npack() function
5b90: 20 6d 61 79 20 6f 76 65 72 72 65 61 64 20 74 68   may overread th
5ba0: 65 20 62 75 66 66 65 72 20 62 79 0a 20 20 20 20  e buffer by.    
5bb0: 2a 2a 20 75 70 20 74 6f 20 74 68 65 20 73 69 7a  ** up to the siz
5bc0: 65 20 6f 66 20 31 20 76 61 72 69 6e 74 20 70 6c  e of 1 varint pl
5bd0: 75 73 20 31 20 38 2d 62 79 74 65 20 76 61 6c 75  us 1 8-byte valu
5be0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  e when the curso
5bf0: 72 20 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69  r .    ** positi
5c00: 6f 6e 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  on is restored. 
5c10: 48 65 6e 63 65 20 74 68 65 20 31 37 20 62 79 74  Hence the 17 byt
5c20: 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 61 6c  es of padding al
5c30: 6c 6f 63 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  located .    ** 
5c40: 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 76 6f  below. */.    vo
5c50: 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 70 43  id *pKey;.    pC
5c60: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
5c70: 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
5c80: 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20 70 4b  ze(pCur);.    pK
5c90: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
5ca0: 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 2b  oc( pCur->nKey +
5cb0: 20 39 20 2b 20 38 20 29 3b 0a 20 20 20 20 69 66   9 + 8 );.    if
5cc0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ( pKey ){.      
5cd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5ce0: 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  ePayload(pCur, 0
5cf0: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
5d00: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
5d10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5d20: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  K ){.        mem
5d30: 73 65 74 28 28 28 75 38 2a 29 70 4b 65 79 29 2b  set(((u8*)pKey)+
5d40: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 39  pCur->nKey, 0, 9
5d50: 2b 38 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  +8);.        pCu
5d60: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
5d70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5d80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5d90: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
5da0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5db0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5dc0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
5dd0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
5de0: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
5df0: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
5e00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5e10: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
5e20: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5e30: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
5e40: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
5e50: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
5e60: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
5e70: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
5e80: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
5e90: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
5ea0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
5eb0: 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
5ec0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
5ed0: 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74 65  alid (has eState
5ee0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  ==CURSOR_VALID).
5ef0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
5f00: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
5f10: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
5f20: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
5f30: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
5f40: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
5f50: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
5f60: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
5f70: 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f  State || CURSOR_
5f80: 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e  SKIPNEXT==pCur->
5f90: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5fa0: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5fb0: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5fc0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5fd0: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5fe0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
5ff0: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
6000: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
6010: 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
6020: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6030: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
6040: 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  0;.  }..  rc = s
6050: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75  aveCursorKey(pCu
6060: 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
6070: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62  LITE_OK ){.    b
6080: 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
6090: 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b  rsorPages(pCur);
60a0: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
60b0: 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e = CURSOR_REQUI
60c0: 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70  RESEEK;.  }..  p
60d0: 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
60e0: 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
60f0: 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
6100: 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20  |BTCF_AtLast);. 
6110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6120: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
6130: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
6140: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
6150: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
6160: 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67  ist(BtCursor*,Pg
6170: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
6180: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
6190: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
61a0: 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20  cursors (except 
61b0: 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72  pExcept) that ar
61c0: 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  e open on.** the
61d0: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
61e0: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53  -page iRoot.  "S
61f0: 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  aving the cursor
6200: 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73   position" means
6210: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63   that.** the loc
6220: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72  ation in the btr
6230: 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64  ee is remembered
6240: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
6250: 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  hat it can be.**
6260: 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74   moved back to t
6270: 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74  he same spot aft
6280: 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73  er the btree has
6290: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
62a0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
62b0: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
62c0: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45  before cursor pE
62d0: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
62e0: 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74   modify the.** t
62f0: 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  able, for exampl
6300: 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65  e in BtreeDelete
6310: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
6320: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  t()..**.** If th
6330: 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
6340: 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ore cursors on t
6350: 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74  he same btree, t
6360: 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a  hen all such .**
6370: 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20   cursors should 
6380: 68 61 76 65 20 74 68 65 69 72 20 42 54 43 46 5f  have their BTCF_
6390: 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65  Multiple flag se
63a0: 74 2e 20 20 54 68 65 20 62 74 72 65 65 43 75 72  t.  The btreeCur
63b0: 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  sor().** routine
63c0: 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72   enforces that r
63d0: 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ule.  This routi
63e0: 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f  ne only needs to
63f0: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a   be called in.**
6400: 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61   the uncommon ca
6410: 73 65 20 77 68 65 6e 20 70 45 78 70 65 63 74 20  se when pExpect 
6420: 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  has the BTCF_Mul
6430: 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a  tiple flag set..
6440: 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74  **.** If pExpect
6450: 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f  !=NULL and if no
6460: 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 61   other cursors a
6470: 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  re found on the 
6480: 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a  same root-page,.
6490: 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54 43 46  ** then the BTCF
64a0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f  _Multiple flag o
64b0: 6e 20 70 45 78 70 65 63 74 20 69 73 20 63 6c 65  n pExpect is cle
64c0: 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61  ared, to avoid a
64d0: 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c  nother.** pointl
64e0: 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ess call to this
64f0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
6500: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e  Implementation n
6510: 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69  ote:  This routi
6520: 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73  ne merely checks
6530: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63   to see if any c
6540: 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74  ursors.** need t
6550: 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49 74 20  o be saved.  It 
6560: 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76  calls out to sav
6570: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29  eCursorsOnList()
6580: 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c   in the (unusual
6590: 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20  ).** event that 
65a0: 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e  cursors are in n
65b0: 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76  eed to being sav
65c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
65d0: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
65e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
65f0: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
6600: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
6610: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
6620: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6630: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6640: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
6650: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
6660: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
6670: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
6680: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
6690: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
66a0: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
66b0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
66c0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
66d0: 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  oot) ) break;.  
66e0: 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65 74 75  }.  if( p ) retu
66f0: 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  rn saveCursorsOn
6700: 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70  List(p, iRoot, p
6710: 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70  Except);.  if( p
6720: 45 78 63 65 70 74 20 29 20 70 45 78 63 65 70 74  Except ) pExcept
6730: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
6740: 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
6750: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6760: 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c  ;.}../* This hel
6770: 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73  per routine to s
6780: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f  aveAllCursors do
6790: 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f  es the actual wo
67a0: 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20  rk of saving.** 
67b0: 74 68 65 20 63 75 72 73 6f 72 73 20 69 66 20 61  the cursors if a
67c0: 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72  nd when a cursor
67d0: 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61   is found that a
67e0: 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73  ctually requires
67f0: 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20   saving..** The 
6800: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74  common case is t
6810: 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e  hat no cursors n
6820: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c  eed to be saved,
6830: 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
6840: 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75   is.** broken ou
6850: 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65  t from its calle
6860: 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  r to avoid unnec
6870: 65 73 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69  essary stack poi
6880: 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a  nter movement..*
6890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
68a0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76  ITE_NOINLINE sav
68b0: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a  eCursorsOnList(.
68c0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20    BtCursor *p,  
68d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
68e0: 72 73 74 20 63 75 72 73 6f 72 20 74 68 61 74 20  rst cursor that 
68f0: 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a  needs saving */.
6900: 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20    Pgno iRoot,   
6910: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73         /* Only s
6920: 61 76 65 20 63 75 72 73 6f 72 20 77 69 74 68 20  ave cursor with 
6930: 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65  this iRoot. Save
6940: 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a   all if zero */.
6950: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63    BtCursor *pExc
6960: 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ept    /* Do not
6970: 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73 6f   save this curso
6980: 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20  r */.){.  do{.  
6990: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
69a0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
69b0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
69c0: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  oot) ){.      if
69d0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
69e0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
69f0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
6a00: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
6a10: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
6a20: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
6a30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  );.        if( S
6a40: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
6a50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6a60: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
6a70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6a80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
6a90: 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 20  >iPage>=0 );.   
6aa0: 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
6ab0: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
6ac0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6ad0: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
6ae0: 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20  xt;.  }while( p 
6af0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6b00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6b10: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
6b20: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
6b30: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6b40: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
6b50: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
6b60: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
6b70: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
6b80: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
6b90: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
6ba0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
6bb0: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
6bc0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6bd0: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
6be0: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
6bf0: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
6c00: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
6c10: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
6c20: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
6c30: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
6c40: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
6c50: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
6c60: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
6c70: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
6c80: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
6c90: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
6ca0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6cb0: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
6cc0: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
6cd0: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
6ce0: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
6cf0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
6d00: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
6d10: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
6d20: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
6d30: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
6d40: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
6d50: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
6d60: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
6d70: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
6d80: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
6d90: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
6da0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
6db0: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
6dc0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
6dd0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
6de0: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
6df0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6e00: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
6e10: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
6e20: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
6e30: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
6e40: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
6e50: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
6e60: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
6e70: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
6e80: 49 6e 66 6f 20 3d 20 70 43 75 72 2d 3e 70 4b 65  Info = pCur->pKe
6e90: 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72  yInfo;.    asser
6ea0: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6eb0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6ec0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6ed0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6ee0: 64 52 65 63 6f 72 64 28 70 4b 65 79 49 6e 66 6f  dRecord(pKeyInfo
6ef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6f00: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6f10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6f20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6f30: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 4b  eRecordUnpack(pK
6f40: 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65  eyInfo, (int)nKe
6f50: 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79  y, pKey, pIdxKey
6f60: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6f70: 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 7c 7c  ey->nField==0 ||
6f80: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6f90: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46  >pKeyInfo->nAllF
6fa0: 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 72 63  ield ){.      rc
6fb0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
6fc0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
6fd0: 74 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a  to moveto_done;.
6fe0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6ff0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a     pIdxKey = 0;.
7000: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
7010: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
7020: 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78  acked(pCur, pIdx
7030: 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c  Key, nKey, bias,
7040: 20 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64   pRes);.moveto_d
7050: 6f 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b  one:.  if( pIdxK
7060: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
7070: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
7080: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78  eyInfo->db, pIdx
7090: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
70a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
70b0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
70c0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
70d0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
70e0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
70f0: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
7100: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
7110: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
7120: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
7130: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
7140: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
7150: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
7160: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
7170: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
7180: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
7190: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
71a0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
71b0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
71c0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
71d0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
71e0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
71f0: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
7200: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
7210: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
7220: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
7230: 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
7240: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
7250: 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
7260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
7270: 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
7280: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
7290: 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
72a0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
72b0: 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
72c0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
72d0: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
72e0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
72f0: 41 4c 49 44 3b 0a 20 20 69 66 28 20 73 71 6c 69  ALID;.  if( sqli
7300: 74 65 33 46 61 75 6c 74 53 69 6d 28 34 31 30 29  te3FaultSim(410)
7310: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
7320: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c  ITE_IOERR;.  }el
7330: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
7340: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
7350: 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d  Cur->pKey, pCur-
7360: 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e  >nKey, 0, &skipN
7370: 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ext);.  }.  if( 
7380: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7390: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
73a0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
73b0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
73c0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
73d0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
73e0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
73f0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
7400: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
7410: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
7420: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
7430: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
7440: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
7450: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
7460: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
7470: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
7480: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
7490: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
74a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
74b0: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
74c0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
74d0: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
74e0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
74f0: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
7500: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
7510: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7520: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
7530: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
7540: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
7550: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
7560: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
7570: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
7580: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
7590: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
75a0: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
75b0: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
75c0: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
75d0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
75e0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
75f0: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
7600: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
7610: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
7620: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
7630: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
7640: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
7650: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
7660: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
7670: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
7680: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
7690: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
76a0: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
76b0: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
76c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
76d0: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
76e0: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
76f0: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
7700: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
7710: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
7720: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7730: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
7740: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7750: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
7760: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
7770: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
7780: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
7790: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
77a0: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
77b0: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
77c0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
77d0: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
77e0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
77f0: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
7800: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
7810: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
7820: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
7830: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
7840: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7850: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
7860: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
7870: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
7880: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
7890: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
78a0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
78b0: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
78c0: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
78d0: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
78e0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
78f0: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
7900: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
7910: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
7920: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
7930: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
7940: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
7950: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
7960: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
7970: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
7980: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
7990: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
79a0: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
79b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
79c0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
79d0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
79e0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
79f0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
7a00: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
7a10: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
7a20: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
7a30: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
7a40: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
7a50: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
7a60: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
7a70: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
7a80: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
7a90: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
7aa0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
7ab0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
7ac0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
7ad0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
7ae0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
7af0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
7b00: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
7b10: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7b20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7b30: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7b40: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7b50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7b60: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
7b70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7b80: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
7b90: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
7ba0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
7bb0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
7bc0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7bd0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7be0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7bf0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7c00: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7c10: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7c20: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7c30: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7c40: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7c50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7c60: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7c70: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
7c80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7c90: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
7ca0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7cb0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
7cc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7cd0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7ce0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7cf0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7d00: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7d10: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
7d20: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7d30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7d40: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7d50: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7d60: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7d70: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7d80: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7d90: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7da0: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7db0: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7dc0: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7dd0: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7de0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7df0: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7e00: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7e10: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7e20: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7e30: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7e40: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7e50: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7e60: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7e70: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7e80: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7e90: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7ea0: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7eb0: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7ec0: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7ed0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7ee0: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7ef0: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7f00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7f10: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7f20: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7f30: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7f40: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7f50: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7f60: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7f70: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7f80: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7f90: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7fa0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7fb0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7fc0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7fd0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7fe0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7ff0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
8000: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
8010: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
8020: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
8030: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
8040: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
8050: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
8060: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
8070: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
8080: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
8090: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
80a0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
80b0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
80c0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
80d0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
80e0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
80f0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
8100: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
8110: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
8120: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
8130: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
8140: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
8150: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
8160: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8170: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8180: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8190: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
81a0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
81b0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
81c0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
81d0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
81e0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
81f0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
8200: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
8210: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
8220: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
8230: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8240: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
8250: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
8260: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
8270: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8280: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8290: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
82a0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
82b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
82c0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
82d0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
82e0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
82f0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
8300: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8310: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
8320: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
8330: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
8340: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
8350: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8360: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
8370: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8380: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8390: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
83a0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
83b0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
83c0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
83d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
83e0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
83f0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
8400: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
8410: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8420: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8430: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
8440: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
8450: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8460: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
8470: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8480: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8490: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
84a0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
84b0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
84c0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
84d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
84e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
84f0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
8500: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
8510: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8520: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
8530: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8540: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8550: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
8560: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
8570: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8580: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8590: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
85a0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
85b0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
85c0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
85d0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
85e0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
85f0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
8600: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
8610: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
8620: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
8630: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
8640: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8650: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8660: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8670: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8680: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8690: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
86a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
86b0: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
86c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
86d0: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
86e0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
86f0: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
8700: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
8710: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
8720: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
8730: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
8740: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
8750: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
8760: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
8770: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8780: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8790: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
87a0: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
87b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
87c0: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
87d0: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
87e0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
87f0: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
8800: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
8810: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
8820: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
8830: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8840: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
8850: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8860: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8870: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8880: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8890: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
88a0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
88b0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
88c0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
88d0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
88e0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
88f0: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
8900: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
8910: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
8920: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
8930: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
8940: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
8950: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
8960: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
8970: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8980: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8990: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
89a0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
89b0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
89c0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
89d0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
89e0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
89f0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
8a00: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
8a10: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
8a20: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8a30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8a40: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
8a50: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8a60: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
8a70: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8a80: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8a90: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8aa0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8ab0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
8ac0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
8ad0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
8ae0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
8af0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
8b00: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
8b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
8b20: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
8b30: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
8b40: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
8b50: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
8b60: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
8b70: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8b80: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8b90: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8ba0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8bb0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8bc0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8bd0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8be0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8bf0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8c00: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8c10: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8c20: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8c30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8c50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8c60: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8c70: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8c80: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8c90: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8ca0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8cb0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8cc0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8cd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8ce0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8cf0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8d00: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8d10: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8d20: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8d30: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8d40: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8d50: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8d60: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8d70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8d80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8d90: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8da0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8db0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8dc0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8dd0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8de0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8df0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8e00: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8e10: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8e20: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8e30: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8e40: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8e50: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8e60: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8e70: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8e80: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8e90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8ea0: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8eb0: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8ec0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8ed0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8ee0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8ef0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8f00: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8f10: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8f20: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8f30: 74 72 28 78 2c 20 79 2c 20 7a 2c 20 72 63 29 0a  tr(x, y, z, rc).
8f40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8f50: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8f60: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8f70: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8f80: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8f90: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8fa0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8fb0: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8fc0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8fd0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8fe0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8ff0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
9000: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
9010: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
9020: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
9030: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
9040: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
9050: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
9060: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
9070: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9080: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
9090: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
90a0: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
90b0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
90c0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
90d0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
90e0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
90f0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
9100: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
9110: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
9120: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
9130: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
9140: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
9150: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
9160: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
9170: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
9180: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
9190: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
91a0: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
91b0: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
91c0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
91d0: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
91e0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
91f0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
9200: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
9210: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
9220: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
9230: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
9240: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
9250: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
9260: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
9270: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
9280: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
9290: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
92a0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
92b0: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
92c0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
92d0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
92e0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
92f0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9310: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9320: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9330: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9340: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9350: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9360: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
9370: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9380: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
9390: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
93a0: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
93b0: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
93c0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
93d0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
93e0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
93f0: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
9400: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
9410: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
9420: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
9430: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
9440: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
9450: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
9460: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
9470: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9480: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9490: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
94a0: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
94b0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
94c0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
94d0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
94e0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
94f0: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
9500: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
9510: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9520: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
9530: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
9540: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
9550: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
9560: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
9570: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9580: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9590: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
95a0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
95b0: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
95c0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
95d0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
95e0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
95f0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
9600: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
9610: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
9620: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
9630: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
9640: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
9650: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9660: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9670: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9680: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9690: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
96a0: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
96b0: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
96c0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
96d0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
96e0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
96f0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
9700: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
9710: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9720: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
9730: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
9740: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
9750: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
9760: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
9770: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9780: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9790: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
97a0: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
97b0: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
97c0: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
97d0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
97e0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
97f0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
9800: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
9810: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
9820: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
9830: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
9840: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
9850: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9860: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
9870: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9880: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9890: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
98a0: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
98b0: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
98c0: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
98d0: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
98e0: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
98f0: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
9900: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
9910: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
9920: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
9930: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
9940: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
9950: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
9960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
9970: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9980: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9990: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
99a0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
99b0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
99c0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99e0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
99f0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9a00: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9a20: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9a30: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
9a40: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9a50: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9a60: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9a70: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9a80: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9a90: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9aa0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9ab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9ac0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9ad0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
9ae0: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
9af0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
9b00: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
9b10: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9b20: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9b30: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
9b40: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
9b50: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9b60: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
9b70: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9b80: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9b90: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9bb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9bc0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9bd0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9be0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9bf0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9c00: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9c10: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9c20: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9c30: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9c40: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9c50: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9c60: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9c70: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9c80: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9c90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9ca0: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9cb0: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9cc0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9cd0: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9ce0: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9cf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9d00: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9d10: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9d20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9d30: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9d40: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9d50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9d60: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9d70: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9d80: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9d90: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9da0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9db0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9dc0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9dd0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9de0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9df0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9e00: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9e10: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9e20: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9e30: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9e40: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9e50: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9e60: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9e70: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9e80: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9e90: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9ea0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9eb0: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9ec0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9ed0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9ee0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9ef0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9f00: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9f10: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9f20: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9f30: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9f40: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9f50: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9f60: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9f70: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9f80: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9f90: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9fa0: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9fb0: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9fc0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9fd0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9fe0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ff0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
a000: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
a010: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
a020: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
a030: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a040: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
a050: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
a060: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
a070: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
a080: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
a090: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
a0a0: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
a0b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a0c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
a0d0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
a0e0: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
a0f0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
a100: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
a110: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a120: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a130: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a140: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a150: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a160: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a170: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a180: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a190: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a1a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a1b0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a1c0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a1d0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a1e0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a1f0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a200: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a210: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a220: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a230: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a240: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a250: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a260: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a270: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a280: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a290: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a2a0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a2b0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a2c0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a2d0: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a2e0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a2f0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a300: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
a310: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
a320: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a330: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a340: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a350: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
a360: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a370: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
a380: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
a390: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a3a0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a3b0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a3c0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3e0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
a3f0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
a400: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
a410: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a420: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
a430: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
a440: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a450: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a460: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a470: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a480: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a490: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a4a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a4b0: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a4c0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a4d0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a4e0: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a4f0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a500: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a510: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a520: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a530: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a540: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a550: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a560: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a570: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a580: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a590: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a5a0: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a5b0: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a5c0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a5d0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a5e0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a5f0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a600: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a610: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a620: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a630: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a640: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a650: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a660: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a670: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a680: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a690: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a6a0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a6b0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a6c0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a6d0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a6e0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a6f0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a700: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a710: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a720: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a730: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a740: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a750: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a760: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a770: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a780: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a790: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a7a0: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a7b0: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a7c0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a7d0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a7e0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a7f0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a800: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a810: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a820: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a830: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a840: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a850: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a860: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a870: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a880: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a890: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a8a0: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a8b0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a8c0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a8d0: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a8e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a8f0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a900: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a910: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a920: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a930: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a940: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a950: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a960: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a970: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a980: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a990: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a9a0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a9b0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a9c0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a9d0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a9e0: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a9f0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
aa00: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
aa10: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
aa20: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
aa30: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
aa40: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
aa50: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
aa60: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
aa70: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
aa80: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
aa90: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
aaa0: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
aab0: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
aac0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
aad0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
aae0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
aaf0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
ab00: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
ab10: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
ab20: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
ab30: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ab60: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
ab70: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
ab80: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
abb0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
abc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
abd0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
abe0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
abf0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
ac00: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
ac10: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
ac20: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
ac30: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
ac40: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
ac50: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
ac60: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
ac70: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
ac80: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
ac90: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
aca0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
acb0: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
acc0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
acd0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
ace0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
acf0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
ad00: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
ad10: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
ad20: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
ad30: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
ad40: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
ad50: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
ad60: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
ad70: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
ad80: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
ad90: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
ada0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
adb0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
adc0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
add0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ade0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
adf0: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
ae00: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
ae10: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
ae20: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
ae30: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
ae40: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
ae50: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
ae60: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
ae70: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
ae80: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ae90: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
aea0: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
aeb0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
aec0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
aed0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
aee0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
aef0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
af00: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
af10: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
af20: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
af30: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
af40: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
af50: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
af60: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
af70: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
af80: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
af90: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
afa0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
afb0: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
afc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
afd0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
afe0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
aff0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
b000: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
b010: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
b020: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b030: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
b040: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
b050: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
b060: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
b070: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
b080: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
b090: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
b0a0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
b0b0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
b0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
b0d0: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
b0e0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
b0f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
b100: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
b110: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
b120: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
b130: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
b140: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b150: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
b160: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
b170: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b180: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
b190: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b1a0: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b1b0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b1d0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b1e0: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
b1f0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b200: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
b210: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b220: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b230: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
b240: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
b250: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
b260: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
b270: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
b280: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
b290: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
b2a0: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
b2b0: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
b2c0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
b2d0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
b2e0: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
b2f0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
b300: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
b310: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
b320: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
b330: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b340: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
b350: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
b360: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b370: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
b380: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b390: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
b3a0: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
b3b0: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
b3c0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
b3d0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b3e0: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
b3f0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
b400: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
b410: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
b420: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
b430: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b440: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
b450: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
b460: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
b470: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b480: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b490: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b4a0: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b4b0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b4c0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b4d0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b4e0: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b4f0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b500: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b510: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b520: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b530: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b540: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ./*.** The cell 
b550: 70 43 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74  pCell is current
b560: 6c 79 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  ly part of page 
b570: 70 53 72 63 20 62 75 74 20 77 69 6c 6c 20 75 6c  pSrc but will ul
b580: 74 69 6d 61 74 65 6c 79 20 62 65 20 70 61 72 74  timately be part
b590: 0a 2a 2a 20 6f 66 20 70 50 61 67 65 2e 20 20 28  .** of pPage.  (
b5a0: 70 53 72 63 20 61 6e 64 20 70 50 61 67 65 72 20  pSrc and pPager 
b5b0: 61 72 65 20 6f 66 74 65 6e 20 74 68 65 20 73 61  are often the sa
b5c0: 6d 65 2e 29 20 20 49 66 20 70 43 65 6c 6c 20 63  me.)  If pCell c
b5d0: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 70 6f 69  ontains a.** poi
b5e0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
b5f0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
b600: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
b610: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
b620: 6f 72 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  or.** the overfl
b630: 6f 77 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ow page that wil
b640: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72  l be valid after
b650: 20 70 43 65 6c 6c 20 68 61 73 20 62 65 65 6e 20   pCell has been 
b660: 6d 6f 76 65 64 20 74 6f 20 70 50 61 67 65 2e 0a  moved to pPage..
b670: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b680: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
b690: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b6a0: 4d 65 6d 50 61 67 65 20 2a 70 53 72 63 2c 20 75  MemPage *pSrc, u
b6b0: 38 20 2a 70 43 65 6c 6c 2c 69 6e 74 20 2a 70 52  8 *pCell,int *pR
b6c0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
b6d0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
b6e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b6f0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
b700: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b710: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b720: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
b730: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
b740: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
b750: 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20 20 20   Pgno ovfl;.    
b760: 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
b770: 4e 28 70 53 72 63 2d 3e 61 44 61 74 61 45 6e 64  N(pSrc->aDataEnd
b780: 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69  , pCell, pCell+i
b790: 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
b7a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b7b0: 53 72 63 21 3d 70 50 61 67 65 20 29 3b 0a 20 20  Src!=pPage );.  
b7c0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
b7d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b7e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b7f0: 20 20 7d 0a 20 20 20 20 6f 76 66 6c 20 3d 20 67    }.    ovfl = g
b800: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
b810: 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20  nfo.nSize-4]);. 
b820: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
b830: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
b840: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
b850: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
b860: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
b870: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
b880: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
b890: 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  en. This routine
b8a0: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c   reorganizes cel
b8b0: 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ls within the.**
b8c0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
b8d0: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d  ere are no free-
b8e0: 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72  blocks on the fr
b8f0: 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a  ee-block list..*
b900: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
b910: 4d 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d  MaxFrag is the m
b920: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
b930: 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63   fragmented spac
b940: 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
b950: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b960: 70 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20  page after this 
b970: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
b980: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
b990: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
b9a0: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
b9b0: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
b9c0: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
b9d0: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
b9e0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b9f0: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
ba00: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
ba10: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
ba20: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
ba30: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
ba40: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
ba50: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
ba60: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
ba70: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
ba80: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
ba90: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
baa0: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
bab0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d  e *pPage, int nM
bac0: 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69  axFrag){.  int i
bad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bae0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
baf0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
bb00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bb10: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
bb20: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
bb30: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
bb60: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
bb70: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb90: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
bba0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
bbb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
bbc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
bbd0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
bbe0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
bbf0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
bc00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
bc10: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bc20: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
bc30: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
bc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bc50: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
bc60: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
bc70: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bc90: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
bca0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bcb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bcc0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
bcd0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
bce0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bcf0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
bd00: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
bd10: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
bd20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
bd30: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
bd40: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
bd50: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
bd60: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
bd70: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bd80: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
bd90: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bdb0: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bdc0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61  ll index */..  a
bdd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bde0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bdf0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
be00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
be10: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
be20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
be30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
be40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
be50: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
be60: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
be70: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
be80: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
be90: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bea0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
beb0: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
bec0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bed0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
bee0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bef0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
bf00: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bf10: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
bf20: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
bf30: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
bf40: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
bf50: 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
bf60: 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  );.  iCellFirst 
bf70: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
bf80: 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65  *nCell;.  usable
bf90: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
bfa0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
bfb0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
bfc0: 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69  handles pages wi
bfd0: 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  th two or fewer 
bfe0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20  free blocks and 
bff0: 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72  nMaxFrag.  ** or
c000: 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65   fewer fragmente
c010: 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73  d bytes. In this
c020: 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74   case it is fast
c030: 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20  er to move the. 
c040: 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29   ** two (or one)
c050: 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73   blocks of cells
c060: 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29   using memmove()
c070: 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71   and add the req
c080: 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65  uired.  ** offse
c090: 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74  ts to each point
c0a0: 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  er in the cell-p
c0b0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61  ointer array tha
c0c0: 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a  n it is to .  **
c0d0: 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65   reconstruct the
c0e0: 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a   entire page.  *
c0f0: 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74  /.  if( (int)dat
c100: 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72  a[hdr+7]<=nMaxFr
c110: 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  ag ){.    int iF
c120: 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ree = get2byte(&
c130: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
c140: 20 20 69 66 28 20 69 46 72 65 65 3e 75 73 61 62    if( iFree>usab
c150: 6c 65 53 69 7a 65 2d 34 20 29 20 72 65 74 75 72  leSize-4 ) retur
c160: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c170: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c180: 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20    if( iFree ){. 
c190: 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20       int iFree2 
c1a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c1b0: 5b 69 46 72 65 65 5d 29 3b 0a 20 20 20 20 20 20  [iFree]);.      
c1c0: 69 66 28 20 69 46 72 65 65 32 3e 75 73 61 62 6c  if( iFree2>usabl
c1d0: 65 53 69 7a 65 2d 34 20 29 20 72 65 74 75 72 6e  eSize-4 ) return
c1e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c1f0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c200: 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32     if( 0==iFree2
c210: 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32   || (data[iFree2
c220: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72  ]==0 && data[iFr
c230: 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20  ee2+1]==0) ){.  
c240: 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d        u8 *pEnd =
c250: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
c260: 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  t + nCell*2];.  
c270: 20 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b        u8 *pAddr;
c280: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32  .        int sz2
c290: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
c2a0: 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28  t sz = get2byte(
c2b0: 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b  &data[iFree+2]);
c2c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70  .        int top
c2d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c2e0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
c2f0: 20 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72 65     if( top>=iFre
c300: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
c310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c320: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c330: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c340: 20 20 20 20 69 66 28 20 69 46 72 65 65 32 20 29      if( iFree2 )
c350: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
c360: 69 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32 20  iFree+sz>iFree2 
c370: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c380: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c390: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
c3a0: 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  z2 = get2byte(&d
c3b0: 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a  ata[iFree2+2]);.
c3c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
c3d0: 72 65 65 32 2b 73 7a 32 20 3e 20 75 73 61 62 6c  ree2+sz2 > usabl
c3e0: 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53  eSize ) return S
c3f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
c400: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
c410: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61       memmove(&da
c420: 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d  ta[iFree+sz+sz2]
c430: 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  , &data[iFree+sz
c440: 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65  ], iFree2-(iFree
c450: 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  +sz));.         
c460: 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20   sz += sz2;.    
c470: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 46      }else if( iF
c480: 72 65 65 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a  ree+sz>usableSiz
c490: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
c4a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c4b0: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c4c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
c4d0: 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b       cbrk = top+
c4e0: 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
c4f0: 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d  rt( cbrk+(iFree-
c500: 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  top) <= usableSi
c510: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
c520: 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b  mmove(&data[cbrk
c530: 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69  ], &data[top], i
c540: 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20  Free-top);.     
c550: 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61     for(pAddr=&da
c560: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20  ta[cellOffset]; 
c570: 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64  pAddr<pEnd; pAdd
c580: 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  r+=2){.         
c590: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
c5a0: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
c5b0: 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b   if( pc<iFree ){
c5c0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c5d0: 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20   pc+sz); }.     
c5e0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 63       else if( pc
c5f0: 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32 62  <iFree2 ){ put2b
c600: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
c610: 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  2); }.        }.
c620: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66          goto def
c630: 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20  ragment_out;.   
c640: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
c650: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
c660: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ize;.  iCellLast
c670: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
c680: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
c690: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
c6a0: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
c6b0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
c6c0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
c6d0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
c6e0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
c6f0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c700: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
c710: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c720: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
c730: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c740: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
c750: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
c760: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
c770: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
c780: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
c790: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
c7a0: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
c7b0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
c7c0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
c7d0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
c7e0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
c7f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c800: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c810: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
c820: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
c830: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
c840: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
c850: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
c860: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
c870: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
c880: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
c890: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c8a0: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
c8b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c8c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c8d0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c8e0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
c8f0: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
c900: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
c910: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
c920: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
c930: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c940: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c950: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
c960: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
c970: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
c980: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
c990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c9a0: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
c9b0: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
c9c0: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
c9d0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
c9e0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
c9f0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
ca00: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
ca10: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
ca20: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
ca30: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
ca40: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
ca50: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
ca60: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
ca70: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
ca80: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
ca90: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37    }.  data[hdr+7
caa0: 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d  ] = 0;.. defragm
cab0: 65 6e 74 5f 6f 75 74 3a 0a 20 20 61 73 73 65 72  ent_out:.  asser
cac0: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
cad0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 61 74 61  =0 );.  if( data
cae0: 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65  [hdr+7]+cbrk-iCe
caf0: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
cb00: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
cb10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
cb20: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
cb30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
cb40: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
cb50: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
cb60: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
cb70: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
cb80: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
cb90: 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  2] = 0;.  memset
cba0: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
cbb0: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
cbc0: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
cbd0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
cbe0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
cbf0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
cc00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cc10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
cc20: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
cc30: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
cc40: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
cc50: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
cc60: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
cc70: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
cc80: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
cc90: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
cca0: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
ccb0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
ccc0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
ccd0: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
cce0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
ccf0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
cd00: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
cd10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cd20: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
cd30: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
cd40: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
cd50: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
cd60: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
cd70: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
cd80: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
cd90: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
cda0: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
cdb0: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
cdc0: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
cdd0: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
cde0: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
cdf0: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
ce00: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
ce10: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
ce20: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
ce30: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
ce40: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ce50: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
ce60: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
ce70: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
ce80: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
ce90: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
cea0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
ceb0: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ced0: 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68 65  ffset to page he
cee0: 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 20 63  ader */.  u8 * c
cef0: 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
cf00: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
cf10: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61 74       /* Page dat
cf20: 61 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72  a */.  int iAddr
cf30: 20 3d 20 68 64 72 20 2b 20 31 3b 20 20 20 20 20   = hdr + 1;     
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
cf60: 70 74 72 20 74 6f 20 70 63 20 2a 2f 0a 20 20 69  ptr to pc */.  i
cf70: 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
cf80: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b  (&aData[iAddr]);
cf90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
cfa0: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 20 73  ress of a free s
cfb0: 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 78 3b 20  lot */.  int x; 
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 20 2f 2a 20 45 78 63 65 73 73 20 73 69      /* Excess si
cff0: 7a 65 20 6f 66 20 74 68 65 20 73 6c 6f 74 20 2a  ze of the slot *
d000: 2f 0a 20 20 69 6e 74 20 6d 61 78 50 43 20 3d 20  /.  int maxPC = 
d010: 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
d020: 53 69 7a 65 20 2d 20 6e 42 79 74 65 3b 20 20 2f  Size - nByte;  /
d030: 2a 20 4d 61 78 20 61 64 64 72 65 73 73 20 66 6f  * Max address fo
d040: 72 20 61 20 75 73 61 62 6c 65 20 73 6c 6f 74 20  r a usable slot 
d050: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
d090: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61  ree slot */..  a
d0a0: 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20  ssert( pc>0 );. 
d0b0: 20 77 68 69 6c 65 28 20 70 63 3c 3d 6d 61 78 50   while( pc<=maxP
d0c0: 43 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  C ){.    /* EVID
d0d0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
d0e0: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
d0f0: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
d100: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
d110: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
d120: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
d130: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
d140: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
d150: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
d160: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
d170: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
d180: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
d190: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
d1a0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
d1b0: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
d1c0: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
d1d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
d1e0: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
d1f0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
d200: 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20     if( x<4 ){.  
d210: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
d220: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
d230: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
d240: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
d250: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
d260: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
d270: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
d280: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
d290: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
d2a0: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
d2b0: 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30  7]>57 ) return 0
d2c0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
d2d0: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
d2e0: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
d2f0: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
d300: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
d310: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
d320: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
d330: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
d340: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
d350: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
d360: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
d370: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
d380: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  )x;.      }else 
d390: 69 66 28 20 78 2b 70 63 20 3e 20 6d 61 78 50 43  if( x+pc > maxPC
d3a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
d3b0: 68 69 73 20 73 6c 6f 74 20 65 78 74 65 6e 64 73  his slot extends
d3c0: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
d3d0: 74 68 65 20 75 73 61 62 6c 65 20 70 61 72 74 20  the usable part 
d3e0: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
d3f0: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
d400: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
d410: 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  E(pPg);.        
d420: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
d430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
d440: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
d450: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
d460: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
d470: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
d480: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
d490: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
d4a0: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
d4b0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
d4c0: 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
d4d0: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
d4e0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
d4f0: 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d  n &aData[pc + x]
d500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64  ;.    }.    iAdd
d510: 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d  r = pc;.    pc =
d520: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
d530: 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  [pc]);.    if( p
d540: 63 3c 3d 69 41 64 64 72 2b 73 69 7a 65 20 29 7b  c<=iAddr+size ){
d550: 0a 20 20 20 20 20 20 69 66 28 20 70 63 20 29 7b  .      if( pc ){
d560: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
d570: 6e 65 78 74 20 73 6c 6f 74 20 69 6e 20 74 68 65  next slot in the
d580: 20 63 68 61 69 6e 20 69 73 20 6e 6f 74 20 70 61   chain is not pa
d590: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
d5a0: 65 20 63 75 72 72 65 6e 74 20 73 6c 6f 74 20 2a  e current slot *
d5b0: 2f 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d  /.        *pRc =
d5c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d5d0: 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20 20 20  PAGE(pPg);.     
d5e0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
d5f0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
d600: 66 28 20 70 63 3e 6d 61 78 50 43 2b 6e 42 79 74  f( pc>maxPC+nByt
d610: 65 2d 34 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  e-4 ){.    /* Th
d620: 65 20 66 72 65 65 20 73 6c 6f 74 20 63 68 61 69  e free slot chai
d630: 6e 20 65 78 74 65 6e 64 73 20 6f 66 66 20 74 68  n extends off th
d640: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d650: 65 20 2a 2f 0a 20 20 20 20 2a 70 52 63 20 3d 20  e */.    *pRc = 
d660: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
d670: 41 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  AGE(pPg);.  }.  
d680: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d690: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
d6a0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
d6b0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
d6c0: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
d6d0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
d6e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
d6f0: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
d700: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
d710: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
d720: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
d730: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
d740: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
d750: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
d760: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
d770: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
d780: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
d790: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
d7a0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
d7b0: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
d7c0: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
d7d0: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
d7e0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d7f0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
d800: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
d810: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
d820: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
d830: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
d840: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
d850: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
d860: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
d870: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
d880: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
d890: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
d8a0: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
d8b0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
d8c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
d8d0: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
d8e0: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
d8f0: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
d900: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
d910: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
d920: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
d930: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
d940: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
d950: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
d960: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
d970: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
d980: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d990: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
d9a0: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
d9b0: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
d9c0: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
d9d0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
d9e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
d9f0: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
da20: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
da30: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
da40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
da50: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
da60: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
da70: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
da80: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
da90: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
daa0: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
dab0: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
dac0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
dad0: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
dae0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
daf0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
db00: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
db10: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
db20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
db30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
db40: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
db50: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
db60: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
db70: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
db80: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
db90: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
dba0: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
dbb0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
dbc0: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
dbd0: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
dbe0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
dbf0: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
dc00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
dc10: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
dc20: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
dc30: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
dc40: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
dc50: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
dc60: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
dc70: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
dc80: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
dc90: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
dca0: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
dcb0: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
dcc0: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
dcd0: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
dce0: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
dcf0: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
dd00: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
dd10: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
dd20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
dd30: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
dd40: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
dd50: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
dd60: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
dd70: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
dd80: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
dd90: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
dda0: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
ddb0: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
ddc0: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
ddd0: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
dde0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ddf0: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
de00: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
de10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
de20: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
de30: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
de40: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
de50: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
de60: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
de70: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
de80: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
de90: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
dea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
deb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dec0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
ded0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
dee0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
def0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
df00: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
df10: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
df20: 6c 6c 20 70 6f 69 6e 74 65 72 2c 0a 20 20 2a 2a  ll pointer,.  **
df30: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
df40: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
df50: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
df60: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
df70: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73   looking for a s
df80: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
df90: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
dfa0: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
dfb0: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
dfc0: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
dfd0: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
dfe0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
dff0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
e000: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
e010: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
e020: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
e030: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
e040: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
e050: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
e060: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
e070: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
e080: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
e090: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
e0a0: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
e0b0: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
e0c0: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
e0d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e0e0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
e0f0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
e100: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
e110: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
e120: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
e130: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
e140: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
e150: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
e160: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
e170: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
e180: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
e190: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
e1a0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
e1b0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
e1c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e1d0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
e1e0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
e1f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
e200: 65 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20  e->nFree>=0 );. 
e210: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
e220: 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49  ntPage(pPage, MI
e230: 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65  N(4, pPage->nFre
e240: 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b  e - (2+nByte)));
e250: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
e260: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
e270: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
e280: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
e290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
e2a0: 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  p+2+nByte<=top )
e2b0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
e2c0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
e2d0: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
e2e0: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
e2f0: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
e300: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
e310: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
e320: 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65   btreeComputeFre
e330: 65 53 70 61 63 65 28 29 20 63 61 6c 6c 20 68 61  eSpace() call ha
e340: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
e350: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
e360: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
e370: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
e380: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
e390: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
e3a0: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
e3b0: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
e3c0: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
e3d0: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
e3e0: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
e3f0: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
e400: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
e410: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
e420: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
e430: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
e440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
e450: 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70  +nByte <= (int)p
e460: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e470: 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78  eSize );.  *pIdx
e480: 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e   = top;.  return
e490: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e4a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65  *.** Return a se
e4b0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61  ction of the pPa
e4c0: 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65  ge->aData to the
e4d0: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68   freelist..** Th
e4e0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
e4f0: 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f  the new free blo
e500: 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61  ck is pPage->aDa
e510: 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e  ta[iStart].** an
e520: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
e530: 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65  e block is iSize
e540: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64   bytes..**.** Ad
e550: 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b  jacent freeblock
e560: 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e  s are coalesced.
e570: 0a 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74 68 6f 75  .**.** Even thou
e580: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
e590: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
e5a0: 64 20 62 79 20 62 74 72 65 65 43 6f 6d 70 75 74  d by btreeComput
e5b0: 65 46 72 65 65 53 70 61 63 65 28 29 2c 0a 2a 2a  eFreeSpace(),.**
e5c0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
e5d0: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
e5e0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
e5f0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
e600: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
e610: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
e620: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
e630: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
e640: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
e650: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
e660: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
e670: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
e680: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
e690: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
e6a0: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
e6b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e6c0: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
e6d0: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
e6e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
e6f0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
e700: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
e710: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
e720: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
e750: 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74  s of ptr to next
e760: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
e770: 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20  u16 iFreeBlk;   
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e7a0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
e7b0: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68  eblock */.  u8 h
e7c0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72    /* Page header
e7f0: 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30   size.  0 or 100
e800: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d   */.  u8 nFrag =
e810: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e830: 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67  eduction in frag
e840: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  mentation */.  u
e850: 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69  16 iOrigSize = i
e860: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
e870: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
e880: 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20   value of iSize 
e890: 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20  */.  u16 x;     
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
e8c0: 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
e8d0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75  tent area */.  u
e8e0: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
e8f0: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
e900: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
e910: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
e920: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
e930: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
e940: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
e950: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
e960: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
e970: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
e980: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e990: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
e9a0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
e9b0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e9c0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
e9d0: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
e9e0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
e9f0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
ea00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
ea10: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
ea20: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
ea30: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
ea40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ea50: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ea60: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ea70: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
ea80: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
ea90: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
eaa0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
eab0: 53 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42  Start<=pPage->pB
eac0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
ead0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73  );..  /* The lis
eae0: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
eaf0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
eb00: 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e  ding order.  Fin
eb10: 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74  d the .  ** spot
eb20: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65   on the list whe
eb30: 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  re iStart should
eb40: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
eb50: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
eb60: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
eb70: 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  Ptr = hdr + 1;. 
eb80: 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31   if( data[iPtr+1
eb90: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74  ]==0 && data[iPt
eba0: 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72  r]==0 ){.    iFr
ebb0: 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  eeBlk = 0;  /* S
ebc0: 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
ebd0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72  case when the fr
ebe0: 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20  eelist is empty 
ebf0: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
ec00: 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b  while( (iFreeBlk
ec10: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ec20: 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74  a[iPtr]))<iStart
ec30: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
ec40: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b  reeBlk<iPtr+4 ){
ec50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
ec60: 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b  eeBlk==0 ) break
ec70: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ec80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ec90: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
eca0: 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20     }.      iPtr 
ecb0: 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20  = iFreeBlk;.    
ecc0: 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  }.    if( iFreeB
ecd0: 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  lk>pPage->pBt->u
ece0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20  sableSize-4 ){. 
ecf0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ed00: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
ed10: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
ed20: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
ed30: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
ed40: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
ed50: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
ed60: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
ed70: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
ed80: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
ed90: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
eda0: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
edb0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
edc0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
edd0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
ede0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
edf0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
ee00: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
ee10: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
ee20: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
ee30: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
ee40: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
ee50: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
ee60: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
ee70: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
ee80: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
ee90: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
eea0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
eeb0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
eec0: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
eed0: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
eee0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
eef0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
ef00: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
ef10: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
ef20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
ef30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
ef40: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
ef50: 20 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d   }.      iSize =
ef60: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
ef70: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
ef80: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ef90: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
efa0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
efb0: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
efc0: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
efd0: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
efe0: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
eff0: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
f000: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
f010: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
f020: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
f030: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
f040: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
f050: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
f060: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
f070: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
f080: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
f090: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
f0a0: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
f0b0: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
f0c0: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
f0d0: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
f0e0: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
f0f0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f100: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
f110: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
f120: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
f130: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
f140: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
f150: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
f160: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
f170: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
f180: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
f190: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f1a0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
f1b0: 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
f1c0: 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
f1d0: 0a 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28  .  x = get2byte(
f1e0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
f1f0: 20 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29   if( iStart<=x )
f200: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
f210: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
f220: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
f230: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
f240: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
f250: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
f260: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
f270: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
f280: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
f290: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
f2a0: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
f2b0: 20 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74   iStart<x || iPt
f2c0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
f2d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f2e0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
f2f0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
f300: 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c  [hdr+1], iFreeBl
f310: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
f320: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69  (&data[hdr+5], i
f330: 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  End);.  }else{. 
f340: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
f350: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
f360: 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74  nto the freelist
f370: 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65   */.    put2byte
f380: 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53  (&data[iPtr], iS
f390: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  tart);.  }.  if(
f3a0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73   pPage->pBt->bts
f3b0: 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
f3c0: 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f  _SECURE ){.    /
f3d0: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
f3e0: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
f3f0: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
f400: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
f410: 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  e.    ** option 
f420: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
f430: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
f440: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
f450: 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
f460: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
f470: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75   iFreeBlk);.  pu
f480: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
f490: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
f4a0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
f4b0: 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  = iOrigSize;.  r
f4c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f4d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
f4e0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
f4f0: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
f500: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
f510: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
f520: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
f530: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
f540: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
f550: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
f560: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
f570: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
f580: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
f590: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
f5a0: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
f5b0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
f5c0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
f5d0: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
f5e0: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
f5f0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
f600: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
f610: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
f620: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
f630: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
f640: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f650: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
f660: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
f670: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
f680: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
f690: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
f6a0: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
f6b0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
f6c0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
f6d0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f6e0: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
f6f0: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
f700: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f710: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f720: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f730: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
f740: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
f750: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
f760: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
f770: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
f780: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
f790: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
f7a0: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
f7b0: 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43  eaf;.  pPage->xC
f7c0: 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
f7d0: 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70  zePtr;.  pBt = p
f7e0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
f7f0: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
f800: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
f810: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a  NTKEY) ){.    /*
f820: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f830: 30 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61  07291-35328 A va
f840: 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20  lue of 5 (0x05) 
f850: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f860: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65  s an.    ** inte
f870: 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65  rior table b-tre
f880: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
f890: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
f8a0: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
f8b0: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
f8c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39  IDENCE-OF: R-269
f8d0: 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65  00-09176 A value
f8e0: 20 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65   of 13 (0x0d) me
f8f0: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
f900: 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61  a.    ** leaf ta
f910: 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
f920: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f930: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
f940: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
f950: 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
f960: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
f970: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
f980: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
f990: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
f9a0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
f9b0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f9c0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f9d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f9e0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f9f0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
fa00: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
fa10: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f   = cellSizePtrNo
fa20: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70  Payload;.      p
fa30: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
fa40: 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
fa50: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  lPtrNoPayload;. 
fa60: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
fa70: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
fa80: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
fa90: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
faa0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
fab0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
fac0: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
fad0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
fae0: 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33  CE-OF: R-43316-3
faf0: 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20  7308 A value of 
fb00: 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74  2 (0x02) means t
fb10: 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20  he page is an.  
fb20: 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e    ** interior in
fb30: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
fb40: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
fb50: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
fb60: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
fb70: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35  ENCE-OF: R-59615
fb80: 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f  -42828 A value o
fb90: 66 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e  f 10 (0x0a) mean
fba0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
fbb0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65      ** leaf inde
fbc0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
fbd0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
fbe0: 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
fbf0: 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
fc00: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
fc10: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
fc20: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
fc30: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
fc40: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
fc50: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
fc60: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
fc70: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
fc80: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
fc90: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
fca0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
fcb0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
fcc0: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
fcd0: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
fce0: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
fcf0: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
fd00: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
fd10: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
fd20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
fd30: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
fd40: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
fd50: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
fd60: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
fd70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fd80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  OK;.}../*.** Com
fd90: 70 75 74 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  pute the amount 
fda0: 6f 66 20 66 72 65 65 73 70 61 63 65 20 6f 6e 20  of freespace on 
fdb0: 74 68 65 20 70 61 67 65 2e 20 20 49 6e 20 6f 74  the page.  In ot
fdc0: 68 65 72 20 77 6f 72 64 73 2c 20 66 69 6c 6c 0a  her words, fill.
fdd0: 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 67 65 2d  ** in the pPage-
fde0: 3e 6e 46 72 65 65 20 66 69 65 6c 64 2e 0a 2a 2f  >nFree field..*/
fdf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
fe00: 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63  eComputeFreeSpac
fe10: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
fe20: 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  ){.  int pc;    
fe30: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
fe40: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
fe50: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
fe60: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20  aData[] */.  u8 
fe70: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
fe80: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
fe90: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
fea0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  eader */.  u8 *d
feb0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
fec0: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
fed0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
fee0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
fef0: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
ff00: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
ff10: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
ff20: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
ff30: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
ff40: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
ff50: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
ff60: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
ff70: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ff80: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ff90: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ea */.  int iCel
ffa0: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
ffb0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
ffc0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
ffd0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  offset */.  int 
ffe0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
fff0: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
10000 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
10010 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61  k offset */..  a
10020 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
10030 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
10040 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62  ( pPage->pBt->db
10050 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10060 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10070 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
10080 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
10090 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
100a0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
100b0 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
100c0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
100d0 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
100e0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
100f0 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
10100 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
10110 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
10120 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
10130 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
10140 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
10150 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
10160 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
10170 50 61 67 65 2d 3e 6e 46 72 65 65 3c 30 20 29 3b  Page->nFree<0 );
10180 0a 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ..  usableSize =
10190 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
101a0 62 6c 65 53 69 7a 65 3b 0a 20 20 68 64 72 20 3d  bleSize;.  hdr =
101b0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
101c0 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  t;.  data = pPag
101d0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45  e->aData;.  /* E
101e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
101f0 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
10200 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
10210 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
10220 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 73  nates.  ** the s
10230 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
10240 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41   content area. A
10250 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20   zero value for 
10260 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a  this integer is.
10270 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64    ** interpreted
10280 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20   as 65536. */.  
10290 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
102a0 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
102b0 35 5d 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  5]);.  iCellFirs
102c0 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
102d0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
102e0 65 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  e + 2*pPage->nCe
102f0 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
10300 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
10310 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
10320 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
10330 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
10340 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  ** EVIDENCE-O
10350 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
10360 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
10370 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
10380 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  1 gives the.  **
10390 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
103a0 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
103b0 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
103c0 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
103d0 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62  re no.  ** freeb
103e0 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d  locks. */.  pc =
103f0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10400 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
10410 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
10420 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e   top;  /* Init n
10430 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65  Free to non-free
10440 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65  block free space
10450 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29   */.  if( pc>0 )
10460 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20  {.    u32 next, 
10470 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
10480 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20  <iCellFirst ){. 
10490 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
104a0 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
104b0 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
104c0 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
104d0 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
104e0 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
104f0 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
10500 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
10510 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
10520 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
10530 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10540 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20 0a  T_PAGE(pPage); .
10550 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
10560 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   1 ){.      if( 
10570 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
10580 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62          /* Freeb
10590 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64  lock off the end
105a0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
105b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
105c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
105d0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
105e0 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
105f0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
10600 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
10610 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10620 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e  [pc+2]);.      n
10630 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
10640 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
10650 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
10660 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63   break;.      pc
10670 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
10680 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b     if( next>0 ){
10690 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c  .      /* Freebl
106a0 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e  ock not in ascen
106b0 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
106c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
106d0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
106e0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
106f0 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e   if( pc+size>(un
10700 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c  signed int)usabl
10710 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
10720 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b  * Last freeblock
10730 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70 61   extends past pa
10740 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20  ge end */.      
10750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10760 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10770 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10780 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
10790 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
107a0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
107b0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
107c0 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
107d0 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
107e0 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
107f0 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
10800 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
10810 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10820 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
10830 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
10840 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20  sable-size.  ** 
10850 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
10860 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
10870 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
10880 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
10890 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
108a0 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
108b0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
108c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
108d0 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20  tent.  ** area, 
108e0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
108f0 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
10900 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
10910 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ge..  */.  if( n
10920 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
10930 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10940 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10950 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
10960 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
10970 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
10980 6c 6c 46 69 72 73 74 29 3b 0a 20 20 72 65 74 75  llFirst);.  retu
10990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
109a0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 64 64 69 74 69  ./*.** Do additi
109b0 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
109c0 6b 20 61 66 74 65 72 20 62 74 72 65 65 49 6e 69  k after btreeIni
109d0 74 50 61 67 65 28 29 20 69 66 0a 2a 2a 20 50 52  tPage() if.** PR
109e0 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63  AGMA cell_size_c
109f0 68 65 63 6b 3d 4f 4e 20 0a 2a 2f 0a 73 74 61 74  heck=ON .*/.stat
10a00 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
10a10 4e 45 20 69 6e 74 20 62 74 72 65 65 43 65 6c 6c  NE int btreeCell
10a20 53 69 7a 65 43 68 65 63 6b 28 4d 65 6d 50 61 67  SizeCheck(MemPag
10a30 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
10a40 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
10a50 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
10a60 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
10a70 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
10a80 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
10a90 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
10aa0 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
10ab0 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
10ac0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
10ad0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
10ae0 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
10af0 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
10b00 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
10b10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
10b20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63  cell */.  int pc
10b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10b40 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
10b50 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
10b60 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
10b70 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
10b80 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f       /* Equal to
10b90 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
10ba0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
10bb0 65 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  e;    /* Maximum
10bc0 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
10bd0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
10be0 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
10bf0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 65    /* Start of ce
10c00 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
10c10 2a 2f 0a 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  */..  iCellFirst
10c20 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
10c30 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
10c40 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53  nCell;.  usableS
10c50 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
10c60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
10c70 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
10c80 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 64 61  leSize - 4;.  da
10c90 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
10ca0 61 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  a;.  cellOffset 
10cb0 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
10cc0 73 65 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  set;.  if( !pPag
10cd0 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
10ce0 61 73 74 2d 2d 3b 0a 20 20 66 6f 72 28 69 3d 30  ast--;.  for(i=0
10cf0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
10d00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 63 20 3d  ; i++){.    pc =
10d10 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
10d20 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
10d30 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 74 65 73  t+i*2]);.    tes
10d40 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
10d50 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
10d60 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
10d70 4c 61 73 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Last );.    if( 
10d80 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
10d90 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
10da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10db0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10dc0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
10dd0 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e      sz = pPage->
10de0 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
10df0 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
10e00 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
10e10 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
10e20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
10e30 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
10e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10e50 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10e60 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
10e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10e80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
10e90 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
10ea0 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
10eb0 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
10ec0 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
10ed0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
10ee0 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
10ef0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
10f00 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
10f10 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
10f20 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
10f30 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
10f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
10f50 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
10f60 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
10f70 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
10f80 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
10f90 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
10fa0 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
10fb0 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
10fc0 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
10fd0 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
10fe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
10ff0 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
11000 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 75  age *pPage){.  u
11010 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
11020 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
11030 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
11040 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
11050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
11060 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
11070 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
11080 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
11090 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
110a0 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
110b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
110c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
110d0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
110e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
110f0 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
11100 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
11110 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11130 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
11140 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
11150 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
11160 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11170 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
11180 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
11190 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
111a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
111b0 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20  >isInit==0 );.. 
111c0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
111d0 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  t;.  data = pPag
111e0 65 2d 3e 61 44 61 74 61 20 2b 20 70 50 61 67 65  e->aData + pPage
111f0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 2f  ->hdrOffset;.  /
11200 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11210 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
11220 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
11230 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
11240 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62  ating.  ** the b
11250 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e  -tree page type.
11260 20 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64 65   */.  if( decode
11270 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
11280 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  a[0]) ){.    ret
11290 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
112a0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
112b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
112c0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
112d0 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
112e0 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
112f0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
11300 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
11310 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
11320 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
11330 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
11340 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 68  ffset = pPage->h
11350 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70  drOffset + 8 + p
11360 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
11370 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  ze;.  pPage->aCe
11380 6c 6c 49 64 78 20 3d 20 64 61 74 61 20 2b 20 70  llIdx = data + p
11390 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
113a0 7a 65 20 2b 20 38 3b 0a 20 20 70 50 61 67 65 2d  ze + 8;.  pPage-
113b0 3e 61 44 61 74 61 45 6e 64 20 3d 20 70 50 61 67  >aDataEnd = pPag
113c0 65 2d 3e 61 44 61 74 61 20 2b 20 70 42 74 2d 3e  e->aData + pBt->
113d0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50  usableSize;.  pP
113e0 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
113f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20   pPage->aData + 
11400 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
11410 69 7a 65 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  ize;.  /* EVIDEN
11420 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33  CE-OF: R-37002-3
11430 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74  2774 The two-byt
11440 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
11450 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a  set 3 gives the.
11460 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63    ** number of c
11470 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
11480 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e 43  . */.  pPage->nC
11490 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
114a0 64 61 74 61 5b 33 5d 29 3b 0a 20 20 69 66 28 20  data[3]);.  if( 
114b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
114c0 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
114d0 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
114e0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
114f0 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
11500 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
11510 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
11520 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
11530 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74  (pPage);.  }.  t
11540 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
11550 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
11560 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  Bt) );.  /* EVID
11570 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
11580 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
11590 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
115a0 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
115b0 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20  y.  ** possible 
115c0 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20  for a root page 
115d0 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  of a table that 
115e0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73  contains no rows
115f0 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  ) then the.  ** 
11600 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
11610 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
11620 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
11630 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
11640 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  he.  ** bytes of
11650 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
11660 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
11670 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 0a 20 20 20  age->nCell>0.   
11680 20 20 20 20 7c 7c 20 67 65 74 32 62 79 74 65 4e      || get2byteN
11690 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 35 5d 29  otZero(&data[5])
116a0 3d 3d 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  ==(int)pBt->usab
116b0 6c 65 53 69 7a 65 0a 20 20 20 20 20 20 20 7c 7c  leSize.       ||
116c0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
116d0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
116e0 2d 31 3b 20 20 2f 2a 20 49 6e 64 69 63 61 74 65  -1;  /* Indicate
116f0 20 74 68 61 74 20 74 68 69 73 20 76 61 6c 75 65   that this value
11700 20 69 73 20 79 65 74 20 75 6e 63 6f 6d 70 75 74   is yet uncomput
11710 65 64 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 69  ed */.  pPage->i
11720 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  sInit = 1;.  if(
11730 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20   pBt->db->flags 
11740 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a  & SQLITE_CellSiz
11750 65 43 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eCk ){.    retur
11760 6e 20 62 74 72 65 65 43 65 6c 6c 53 69 7a 65 43  n btreeCellSizeC
11770 68 65 63 6b 28 70 50 61 67 65 29 3b 0a 20 20 7d  heck(pPage);.  }
11780 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11790 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
117a0 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
117b0 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
117c0 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
117d0 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
117e0 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
117f0 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
11800 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
11810 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
11820 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
11830 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
11840 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
11850 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
11860 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
11870 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
11880 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
11890 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
118a0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
118b0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
118c0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
118d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
118e0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
118f0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
11900 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
11910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11920 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11930 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11940 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
11950 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11960 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
11970 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
11980 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11990 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
119a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
119b0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
119c0 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
119d0 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  RE ){.    memset
119e0 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
119f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11a00 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
11a10 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
11a20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
11a30 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
11a40 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
11a50 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
11a60 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
11a70 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
11a80 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
11a90 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
11aa0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11ab0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
11ac0 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
11ad0 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
11ae0 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
11af0 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
11b00 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
11b10 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
11b20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
11b30 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
11b40 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
11b50 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
11b60 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
11b70 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
11b80 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
11b90 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
11ba0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
11bb0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
11bc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
11bd0 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
11be0 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
11bf0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
11c00 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
11c10 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
11c20 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
11c30 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
11c40 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
11c50 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
11c60 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
11c70 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
11c80 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
11c90 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
11ca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
11cb0 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
11cc0 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
11cd0 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
11ce0 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
11cf0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
11d00 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
11d10 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
11d20 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
11d30 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61  .  if( pgno!=pPa
11d40 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ge->pgno ){.    
11d50 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
11d60 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
11d70 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
11d80 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
11d90 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70  = pDbPage;.    p
11da0 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
11db0 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  .    pPage->pgno
11dc0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61   = pgno;.    pPa
11dd0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
11de0 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
11df0 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
11e00 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73   pPage->aData==s
11e10 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
11e20 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20  ta(pDbPage) );. 
11e30 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
11e40 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
11e50 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
11e60 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
11e70 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
11e80 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
11e90 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
11ea0 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c   needed.  See al
11eb0 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73  so: btreeGetUnus
11ec0 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  edPage()..**.** 
11ed0 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  If the PAGER_GET
11ee0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20  _NOCONTENT flag 
11ef0 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
11f00 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
11f10 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68  care.** about th
11f20 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
11f30 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
11f40 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
11f50 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
11f60 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
11f70 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
11f80 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
11f90 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
11fa0 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
11fb0 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
11fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11fd0 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
11fe0 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
11ff0 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
12000 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
12010 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
12020 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
12030 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
12040 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
12050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12060 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
12070 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
12080 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
12090 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
120a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
120b0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
120c0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
120d0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
120e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
120f0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
12100 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
12110 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12120 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12130 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12140 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12150 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
12160 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
12170 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
12180 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
12190 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
121a0 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
121b0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
121c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
121d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
121e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
121f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12200 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
12210 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
12220 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
12230 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
12240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
12250 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
12260 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12270 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12280 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12290 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
122a0 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
122b0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
122c0 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
122d0 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
122e0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
122f0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
12300 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
12310 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
12320 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
12330 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
12340 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
12350 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
12360 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
12370 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
12380 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
12390 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
123a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
123b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
123c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
123d0 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
123e0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
123f0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
12400 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
12410 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
12420 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
12430 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
12440 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
12450 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
12460 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
12470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12480 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
12490 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
124a0 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
124b0 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
124c0 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
124d0 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
124e0 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
124f0 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
12500 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
12510 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
12520 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
12530 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
12540 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
12550 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
12560 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
12570 61 67 65 29 26 30 78 38 30 30 30 30 30 30 30 29  age)&0x80000000)
12580 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
12590 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
125a0 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
125b0 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
125c0 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
125d0 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a  nitialize it..**
125e0 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74  .** If pCur!=0 t
125f0 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
12600 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73  being fetched as
12610 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54   part of a moveT
12620 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c  oChild().** call
12630 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c  .  Do additional
12640 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
12650 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20   on the page in 
12660 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e  this case..** An
12670 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66  d if the fetch f
12680 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ails, this routi
12690 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e  ne must decremen
126a0 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a  t pCur->iPage..*
126b0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73  *.** The page is
126c0 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64   fetched as read
126d0 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43  -write unless pC
126e0 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  ur is not NULL a
126f0 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d  nd is.** a read-
12700 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  only cursor..**.
12710 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
12720 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50  ccurs, then *ppP
12730 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  age is undefined
12740 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61  . It.** may rema
12750 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72  in unchanged, or
12760 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
12770 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  o an invalid val
12780 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
12790 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
127a0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
127b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
127c0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
127d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
127e0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12800 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
12810 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
12820 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
12830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12840 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
12850 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
12860 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
12870 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
12880 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
12890 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67   receive the pag
128a0 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
128b0 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20  int bReadOnly   
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128d0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
128e0 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a  ad-only page */.
128f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
12900 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
12910 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12920 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12930 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
12940 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
12950 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e   ppPage==&pCur->
12960 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
12970 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
12980 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
12990 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
129a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
129b0 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
129c0 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
129d0 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
129e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
129f0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
12a00 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
12a10 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
12a20 72 72 6f 72 31 3b 0a 20 20 7d 0a 20 20 72 63 20  rror1;.  }.  rc 
12a30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
12a40 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
12a50 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
12a60 70 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e  pDbPage, bReadOn
12a70 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ly);.  if( rc ){
12a80 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
12a90 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 31 3b  InitPage_error1;
12aa0 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
12ab0 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
12ac0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
12ad0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
12ae0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
12af0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65  t==0 ){.    btre
12b00 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
12b10 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
12b20 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  Bt);.    rc = bt
12b30 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
12b40 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
12b50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12b60 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64       goto getAnd
12b70 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 32 3b  InitPage_error2;
12b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
12b90 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
12ba0 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
12bb0 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
12bc0 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  )->aData==sqlite
12bd0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
12be0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
12bf0 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63  If obtaining a c
12c00 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20  hild page for a 
12c10 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20  cursor, we must 
12c20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
12c30 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  page is.  ** com
12c40 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
12c50 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20   root page. */. 
12c60 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28 2a   if( pCur && ((*
12c70 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31  ppPage)->nCell<1
12c80 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   || (*ppPage)->i
12c90 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72  ntKey!=pCur->cur
12ca0 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72  IntKey) ){.    r
12cb0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
12cc0 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20  PT_PGNO(pgno);. 
12cd0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
12ce0 69 74 50 61 67 65 5f 65 72 72 6f 72 32 3b 0a 20  itPage_error2;. 
12cf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12d00 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
12d10 69 74 50 61 67 65 5f 65 72 72 6f 72 32 3a 0a 20  itPage_error2:. 
12d20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
12d30 50 61 67 65 29 3b 0a 67 65 74 41 6e 64 49 6e 69  Page);.getAndIni
12d40 74 50 61 67 65 5f 65 72 72 6f 72 31 3a 0a 20 20  tPage_error1:.  
12d50 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
12d60 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
12d70 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
12d80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
12d90 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a  ur->iPage];.  }.
12da0 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
12db0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
12dc0 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
12dd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
12de0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12df0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
12e00 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
12e10 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
12e20 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
12e30 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
12e40 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
12e50 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20  *.** Page1 is a 
12e60 73 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64  special case and
12e70 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
12e80 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50  d using releaseP
12e90 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61  ageOne()..*/.sta
12ea0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
12eb0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
12ec0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
12ed0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
12ee0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12ef0 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
12f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12f10 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
12f20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12f30 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
12f40 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
12f50 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
12f60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12f70 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
12f80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
12f90 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
12fa0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12fb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12fc0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12fd0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
12fe0 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
12ff0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
13000 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
13010 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
13020 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
13030 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
13040 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
13050 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13060 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d  releasePageOne(M
13070 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
13080 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
13090 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
130a0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
130b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
130c0 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
130d0 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
130e0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
130f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
13100 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
13110 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
13120 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
13130 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
13140 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
13150 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
13160 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
13170 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13180 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
13190 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
131a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61  ite3PagerUnrefPa
131b0 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62  geOne(pPage->pDb
131c0 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
131d0 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
131e0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
131f0 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
13200 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
13210 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
13220 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
13230 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
13240 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
13250 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
13260 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
13270 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
13280 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
13290 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
132a0 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
132b0 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
132c0 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
132d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
132e0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
132f0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
13300 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
13310 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
13320 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
13330 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
13340 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
13350 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
13360 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
13370 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
13380 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
13390 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
133a0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
133b0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
133c0 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
133d0 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
133e0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
133f0 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
13400 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
13410 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13420 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
13430 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
13440 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
13450 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
13460 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
13470 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
13480 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
13490 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
134a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
134b0 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
134c0 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
134d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
134e0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
134f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
13500 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
13510 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
13520 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
13530 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
13540 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
13550 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
13560 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
13570 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
13580 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
13590 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
135a0 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
135b0 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
135c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
135d0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
135e0 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
135f0 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
13600 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
13610 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
13620 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
13630 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
13640 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
13650 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
13660 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
13670 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
13680 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
13690 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
136a0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
136b0 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
136c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
136d0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
136e0 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
136f0 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
13700 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13710 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
13720 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
13730 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
13740 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
13750 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
13760 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
13770 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
13780 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
13790 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
137a0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
137b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
137c0 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
137d0 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
137e0 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
137f0 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
13800 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
13810 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
13820 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
13830 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
13840 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
13850 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
13860 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
13870 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
13880 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
13890 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
138a0 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
138b0 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
138c0 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
138d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
138e0 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
138f0 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
13900 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
13910 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
13920 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
13930 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13940 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
13950 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
13960 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
13970 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
13980 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
13990 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
139a0 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
139b0 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
139c0 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
139d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
139e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
139f0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
13a00 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
13a10 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
13a20 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
13a30 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20  Handler,.       
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13a60 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
13a70 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a  >pPager));.}../*
13a80 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
13a90 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
13aa0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
13ab0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
13ac0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
13ad0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
13ae0 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
13af0 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13b00 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
13b10 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
13b20 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
13b30 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
13b40 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
13b50 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
13b60 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
13b70 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
13b80 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
13b90 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
13ba0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13bb0 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
13bc0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
13bd0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
13be0 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
13bf0 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
13c00 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
13c10 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
13c20 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
13c30 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13c40 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
13c50 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
13c60 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
13c70 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
13c80 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
13c90 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
13ca0 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
13cb0 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
13cc0 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
13cd0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
13ce0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
13cf0 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
13d00 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13d10 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
13d20 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
13d30 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
13d40 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
13d50 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
13d60 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
13d70 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
13d80 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
13d90 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
13da0 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
13db0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13dc0 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
13dd0 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
13de0 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
13df0 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
13e00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
13e10 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
13e20 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
13e30 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
13e40 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
13e50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
13e60 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
13e70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
13e80 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
13e90 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
13ea0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
13eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
13ec0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
13ed0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
13ee0 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
13ef0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13f00 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
13f10 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
13f20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f40 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
13f50 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
13f60 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
13f70 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
13f80 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
13f90 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
13fa0 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
13fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
13fc0 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
13fd0 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
13fe0 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
14010 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
14020 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
14030 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
14040 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
14050 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
14060 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
14070 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14080 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
14090 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
140a0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
140b0 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
140d0 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
140e0 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
140f0 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
14100 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
14110 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
14120 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
14130 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
14140 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
14150 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
14160 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
14170 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
14180 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
14190 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
141a0 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
141b0 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
141c0 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
141d0 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
141e0 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
141f0 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
14200 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
14210 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
14220 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
14230 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
14240 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
14250 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
14260 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
14270 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
14280 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
14290 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142b0 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
142c0 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
142d0 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
14300 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
14310 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
14320 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
14330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
14340 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
14350 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14360 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
14370 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
14380 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
14390 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
143a0 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
143b0 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
143c0 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
143d0 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
143e0 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
143f0 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
14400 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
14410 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
14420 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
14430 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
14440 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
14450 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
14460 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
14470 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
14480 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
14490 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
144a0 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
144b0 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
144c0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
144d0 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
144e0 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
144f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
14500 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
14510 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
14520 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
14530 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
14540 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
14550 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
14560 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
14570 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
14580 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
14590 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
145a0 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
145b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
145c0 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  T;.  }.  p->inTr
145d0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
145e0 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
145f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14600 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14610 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
14620 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
14630 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
14640 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
14650 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
14660 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
14670 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14680 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
14690 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
146a0 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
146b0 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
146c0 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
146d0 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
146e0 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
146f0 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
14700 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
14710 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
14720 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
14730 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
14740 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
14750 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
14760 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
14770 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
14780 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
14790 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
147a0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
147b0 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
147c0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
147d0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
147e0 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
147f0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
14800 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
14810 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
14820 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
14830 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
14840 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
14850 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
14860 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
14870 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
14880 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
14890 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
148a0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
148b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
148c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
148d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
148e0 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
148f0 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
14900 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
14910 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
14920 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14940 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
14950 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
14990 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
149a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
149b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
149c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
149d0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
149e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
149f0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
14a00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
14a20 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
14a30 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
14a40 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
14a50 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
14a60 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
14a70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14a80 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
14a90 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
14aa0 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
14ab0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14ac0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14ad0 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
14ae0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14af0 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
14b00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
14b10 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
14b20 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14b30 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14b40 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
14b50 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
14b60 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
14b70 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
14b80 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
14b90 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
14ba0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
14bb0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
14bc0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14bd0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
14be0 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
14bf0 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
14c00 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
14c10 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
14c20 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
14c30 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
14c40 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
14c50 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
14c60 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
14c70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
14c80 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
14c90 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
14ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14cb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14cc0 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14ce0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14cf0 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14d10 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
14d20 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
14d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14d40 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
14d50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14d60 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
14d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
14d80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14d90 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
14da0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
14db0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
14dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14dd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14de0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14df0 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
14e00 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
14e10 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
14e20 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
14e30 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
14e40 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
14e50 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
14e60 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
14e70 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
14e80 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
14e90 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
14ea0 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
14eb0 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
14ec0 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
14ed0 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
14ee0 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
14ef0 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
14f00 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
14f10 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
14f20 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
14f30 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
14f40 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
14f50 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
14f60 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
14f70 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
14f80 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
14f90 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
14fa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
14fb0 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
14fc0 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
14fd0 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
14fe0 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
14ff0 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
15000 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
15010 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
15020 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
15030 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
15040 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
15050 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
15060 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
15070 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
15080 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
15090 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
150a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
150b0 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
150c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
150d0 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
150e0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
150f0 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
15100 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
15110 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
15120 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
15130 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
15140 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15150 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
15160 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
15170 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
15180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15190 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
151a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
151b0 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65    sizeof(MemPage
151e0 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  ), flags, vfsFla
151f0 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
15200 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15220 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
15230 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
15240 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
15250 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15260 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
15270 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
15280 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
15290 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
152a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
152b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
152c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
152d0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
152e0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
152f0 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
15300 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
15310 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
15320 50 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64  PagerSetBusyHand
15330 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
15340 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
15350 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
15360 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
15370 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
15380 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
15390 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
153a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
153b0 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
153c0 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
153d0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
153e0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
153f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15400 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
15410 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
15420 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
15430 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66  ELETE;.#elif def
15440 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54  ined(SQLITE_FAST
15450 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
15460 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
15470 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49  s |= BTS_OVERWRI
15480 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
15490 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
154a0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
154b0 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
154c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
154d0 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
154e0 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
154f0 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
15500 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
15510 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
15520 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
15530 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
15540 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
15550 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
15560 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
15570 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
15580 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
15590 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
155a0 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
155b0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
155c0 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
155d0 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
155e0 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
155f0 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
15600 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
15610 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
15620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15630 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
15640 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
15650 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
15660 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
15670 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
15680 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
15690 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
156a0 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
156b0 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
156c0 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
156d0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
156e0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
156f0 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
15700 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
15710 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
15720 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
15730 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
15740 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
15750 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
15760 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
15770 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
15780 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
15790 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
157a0 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
157b0 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
157c0 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
157d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
157e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
157f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
15800 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
15810 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
15820 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
15830 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
15840 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
15850 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
15860 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
15870 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
15880 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
15890 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
158a0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
158b0 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
158c0 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
158d0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
158e0 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
158f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
15900 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
15910 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
15920 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
15930 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
15940 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
15950 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
15960 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
15970 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
15980 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
15990 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
159a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
159b0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
159c0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
159d0 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
159e0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
159f0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
15a00 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
15a10 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
15a20 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
15a30 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
15a40 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
15a50 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
15a60 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
15a70 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
15a80 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
15a90 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
15aa0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
15ab0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
15ac0 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
15ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
15ae0 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
15af0 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
15b00 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
15b10 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
15b20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
15b30 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15b40 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
15b50 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
15b60 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
15b70 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
15b80 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
15b90 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
15ba0 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
15bb0 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
15bc0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
15bd0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
15be0 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
15bf0 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
15c00 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
15c10 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ).      MUTEX_LO
15c20 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
15c30 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15c40 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
15c50 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
15c60 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
15c70 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
15c80 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
15c90 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
15ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
15cb0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
15cc0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15cd0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
15ce0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
15cf0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
15d00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15d10 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
15d20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
15d30 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
15d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15d50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
15d60 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
15d70 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
15d80 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
15d90 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15da0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15db0 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
15dc0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15dd0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15de0 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
15df0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15e00 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
15e10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15e20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
15e30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15e40 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
15e50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15e60 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
15e70 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
15e80 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
15e90 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
15ea0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
15eb0 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
15ec0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
15ed0 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
15ee0 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
15ef0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
15f00 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
15f10 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
15f20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
15f30 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
15f40 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
15f50 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
15f60 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
15f70 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
15f80 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
15f90 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
15fa0 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
15fb0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
15fc0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
15fd0 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
15fe0 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
15ff0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75  }.        if( (u
16000 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72  ptr)p->pBt<(uptr
16010 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  )pSib->pBt ){.  
16020 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
16030 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
16040 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
16050 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
16060 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
16070 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16080 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
16090 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72  ->pNext && (uptr
160a0 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42  )pSib->pNext->pB
160b0 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29  t<(uptr)p->pBt )
160c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
160d0 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
160e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
160f0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
16100 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
16110 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
16120 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
16130 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
16140 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
16150 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
16160 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
16170 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
16180 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
16190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
161a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
161b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
161c0 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
161d0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
161e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
161f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
16200 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
16210 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
16220 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
16230 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  ->pPager, 0);.  
16240 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
16250 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
16260 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
16270 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
16280 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
16290 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
162a0 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  le;..    /* If t
162b0 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
162c0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
162d0 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
162e0 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
162f0 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
16300 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
16310 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
16320 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
16330 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
16340 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
16350 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
16360 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
16370 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
16380 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
16390 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
163a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
163b0 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
163c0 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
163d0 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
163e0 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20  _SIZE);.    }.. 
163f0 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74     pFile = sqlit
16400 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
16410 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
16420 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
16430 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
16440 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
16450 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  int(pFile, SQLIT
16460 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f  E_FCNTL_PDB, (vo
16470 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20  id*)&pBt->db);. 
16480 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
16490 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
164a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
164b0 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
164c0 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
164d0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
164e0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
164f0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
16500 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
16510 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69  te3BtreeConnecti
16520 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65  onCount(*ppBtree
16530 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  )>0 );.  return 
16540 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
16550 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
16560 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
16570 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
16580 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
16590 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
165a0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
165b0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
165c0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
165d0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
165e0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
165f0 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
16600 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
16610 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
16620 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
16630 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
16640 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
16650 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
16660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16670 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
16680 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
16690 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
166a0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
166b0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
166c0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
166d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
166e0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
166f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
16700 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
16710 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
16720 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
16730 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
16740 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
16750 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
16760 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
16770 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
16780 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
16790 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
167a0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
167b0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
167c0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
167d0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
167e0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
167f0 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
16800 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16810 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
16820 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
16830 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
16840 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
16850 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
16860 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
16870 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
16880 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
16890 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
168a0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
168b0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
168c0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
168d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
168e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
168f0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
16900 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16910 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
16920 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
16930 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
16940 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
16950 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
16960 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
16970 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
16980 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
16990 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
169a0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
169b0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
169c0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
169d0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
169e0 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
169f0 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
16a00 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
16a10 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
16a20 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
16a30 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
16a40 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
16a50 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
16a60 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
16a70 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
16a80 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
16a90 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
16aa0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
16ab0 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
16ac0 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
16ad0 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
16ae0 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
16af0 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
16b00 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
16b10 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
16b20 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
16b30 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
16b40 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
16b50 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
16b60 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
16b70 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
16b80 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
16b90 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
16ba0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
16bb0 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
16bc0 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
16bd0 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
16be0 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
16bf0 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
16c00 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
16c10 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
16c20 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
16c30 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
16c40 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
16c50 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
16c60 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
16c70 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
16c80 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
16c90 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
16ca0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
16cb0 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
16cc0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
16cd0 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
16ce0 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
16cf0 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
16d00 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
16d10 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
16d20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16d30 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
16d40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16d50 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
16d60 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
16d70 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
16d80 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
16d90 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
16da0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
16db0 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
16dc0 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
16dd0 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
16de0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
16df0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
16e00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16e10 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16e20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16e30 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
16e40 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
16e50 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
16e60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
16e70 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
16e80 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
16e90 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
16ea0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
16eb0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
16ec0 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
16ed0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
16ee0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16ef0 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
16f00 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
16f10 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
16f20 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
16f30 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16f40 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
16f50 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
16f60 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
16f70 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
16f80 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
16f90 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
16fa0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16fb0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
16fc0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
16fd0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
16fe0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
16ff0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
17000 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17010 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17020 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17030 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
17040 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
17050 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
17060 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
17070 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
17080 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
17090 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
170a0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
170b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
170c0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
170d0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
170e0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
170f0 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
17100 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
17110 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
17120 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
17130 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
17140 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
17150 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
17160 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
17170 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
17180 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
17190 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
171a0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
171b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
171c0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
171d0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
171e0 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
171f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
17200 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
17210 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
17220 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
17230 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
17240 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
17250 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
17260 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
17270 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
17280 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
17290 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
172a0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
172b0 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
172c0 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
172d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
172e0 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
172f0 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
17300 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
17310 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
17320 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
17330 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
17340 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17350 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
17360 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
17370 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
17380 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
17390 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
173a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
173b0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
173c0 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28   p->db);.    if(
173d0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
173e0 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
173f0 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
17400 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
17410 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
17420 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
17430 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
17440 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
17450 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
17460 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
17470 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
17480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
17490 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
174a0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
174b0 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
174c0 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
174d0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
174e0 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
174f0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
17500 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
17510 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
17520 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
17530 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
17540 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
17550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17560 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
17570 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74  soft" limit on t
17580 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
17590 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
175a0 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75  .** Unused and u
175b0 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20  nmodified pages 
175c0 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64  will be recycled
175d0 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
175e0 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20   of.** pages in 
175f0 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64  the cache exceed
17600 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69  s this soft limi
17610 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65  t.  But the size
17620 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65   of the.** cache
17630 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67   is allowed to g
17640 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20  row larger than 
17650 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74  this limit if it
17660 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72   contains.** dir
17670 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65  ty pages or page
17680 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76  s still in activ
17690 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e use..*/.int sq
176a0 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
176b0 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
176c0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
176d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
176e0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
176f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17700 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
17710 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
17720 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17730 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
17740 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
17750 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
17760 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17770 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
17780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17790 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
177a0 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20  spill" limit on 
177b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
177c0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
177d0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  ..** If the numb
177e0 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65  er of pages exce
177f0 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64  eds this limit d
17800 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72  uring a write tr
17810 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68  ansaction,.** th
17820 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74  e pager might at
17830 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22  tempt to "spill"
17840 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f   pages to the jo
17850 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a  urnal early in.*
17860 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  * order to free 
17870 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  up memory..**.**
17880 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
17890 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65  ned is the curre
178a0 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20  nt spill size.  
178b0 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65  If zero is passe
178c0 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  d.** as an argum
178d0 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20  ent, no changes 
178e0 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
178f0 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69  spill size setti
17900 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20  ng, so.** using 
17910 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61  mxPage of 0 is a
17920 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68   way to query th
17930 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
17940 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  size..*/.int sql
17950 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
17960 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  lSize(Btree *p, 
17970 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
17980 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17990 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73  ->pBt;.  int res
179a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
179b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
179c0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
179d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
179e0 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20  ter(p);.  res = 
179f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
17a00 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50  pillsize(pBt->pP
17a10 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
17a20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17a30 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
17a40 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  res;.}..#if SQLI
17a50 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
17a60 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
17a70 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
17a80 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
17a90 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
17aa0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
17ab0 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
17ac0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17ad0 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
17ae0 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
17af0 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
17b00 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17b10 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
17b20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17b30 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
17b40 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
17b50 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
17b60 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
17b70 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
17b80 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
17b90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17ba0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
17bb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
17bc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
17bd0 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
17be0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17bf0 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
17c00 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
17c10 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
17c20 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
17c30 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
17c40 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
17c50 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
17c60 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
17c70 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
17c80 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
17c90 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
17ca0 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
17cb0 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
17cc0 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
17cd0 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
17ce0 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
17cf0 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
17d00 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
17d10 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
17d20 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
17d30 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
17d40 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
17d50 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
17d60 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
17d70 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
17d80 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
17d90 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
17da0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17db0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
17dc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17dd0 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
17de0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
17df0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
17e00 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
17e10 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
17e20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
17e30 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
17e40 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
17e50 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
17e60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17e70 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
17e80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17e90 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
17ea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17eb0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
17ec0 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
17ed0 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
17ee0 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
17ef0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17f00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17f10 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
17f20 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17f30 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
17f40 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
17f50 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
17f60 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
17f70 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
17f80 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
17f90 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
17fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17fb0 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
17fc0 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
17fd0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
17fe0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
17ff0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
18000 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
18010 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
18020 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
18030 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
18040 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
18050 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
18060 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
18070 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
18080 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
18090 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
180a0 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
180b0 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
180c0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
180d0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
180e0 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
180f0 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
18100 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
18110 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
18120 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
18130 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
18140 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
18150 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
18160 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
18170 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
18180 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
18190 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
181a0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
181b0 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
181c0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
181d0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
181e0 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
181f0 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
18200 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
18210 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
18220 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
18230 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
18240 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
18250 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
18260 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18270 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
18280 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
18290 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
182a0 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
182b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
182c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
182d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
182e0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
182f0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
18300 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
18310 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
18320 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
18330 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
18340 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
18350 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
18360 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
18370 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
18380 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
18390 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
183a0 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
183b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
183c0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
183d0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
183e0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
183f0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
18400 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
18410 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
18420 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
18430 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
18440 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
18450 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
18460 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
18470 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
18480 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
18490 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
184a0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
184b0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
184c0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
184d0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
184e0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
184f0 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
18500 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
18510 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
18520 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
18530 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
18540 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
18550 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
18560 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
18570 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
18580 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18590 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
185a0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
185b0 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
185c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
185d0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
185e0 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
185f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18600 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18610 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
18620 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
18630 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
18640 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
18650 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
18660 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
18670 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
18680 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
18690 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
186a0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
186b0 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
186c0 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
186d0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
186e0 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
186f0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
18700 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
18710 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
18720 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
18730 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
18740 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
18750 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
18760 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
18770 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
18780 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
18790 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
187a0 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
187b0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
187c0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
187d0 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
187e0 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
187f0 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
18800 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
18810 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
18820 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
18830 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
18840 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
18850 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
18860 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
18870 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
18880 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18890 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
188a0 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
188b0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
188c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
188d0 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
188e0 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
188f0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
18900 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
18910 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
18920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18930 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
18940 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
18950 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
18960 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
18970 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
18980 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
18990 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
189a0 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
189b0 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
189c0 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
189d0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
189e0 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
189f0 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
18a00 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
18a10 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
18a20 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
18a30 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
18a40 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
18a50 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
18a60 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
18a70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18a80 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
18a90 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
18aa0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
18ab0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18ac0 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
18ad0 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
18ae0 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
18af0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
18b00 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
18b10 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
18b20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
18b30 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
18b40 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
18b50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18b60 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
18b70 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
18b80 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
18b90 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
18ba0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
18bb0 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
18bc0 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
18bd0 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
18be0 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
18bf0 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
18c00 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
18c10 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
18c20 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
18c30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
18c40 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
18c50 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
18c60 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
18c70 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18c80 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
18c90 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
18ca0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
18cb0 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
18cc0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18cd0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
18ce0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
18cf0 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  e values for the
18d00 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18d10 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  TE and BTS_OVERW
18d20 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  RITE flags:.**.*
18d30 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20  *    newFlag==0 
18d40 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53        Both BTS_S
18d50 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
18d60 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61   BTS_OVERWRITE a
18d70 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20  re cleared.**   
18d80 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20   newFlag==1     
18d90 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c    BTS_SECURE_DEL
18da0 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f  ETE set and BTS_
18db0 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65  OVERWRITE is cle
18dc0 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
18dd0 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f  ag==2       BTS_
18de0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c  SECURE_DELETE cl
18df0 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56  eared and BTS_OV
18e00 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a  ERWRITE is set.*
18e10 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d  *    newFlag==(-
18e20 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73  1)    No changes
18e30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18e40 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75  ine acts as a qu
18e50 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69  ery if newFlag i
18e60 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
18e70 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f  .**.** With BTS_
18e80 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64  OVERWRITE set, d
18e90 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
18ea0 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  s overwritten by
18eb0 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66   zeros, but.** f
18ec0 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
18ed0 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74  es are not writt
18ee0 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
18ef0 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69  atabase.  Thus i
18f00 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65  n-page.** delete
18f10 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65  d content is cle
18f20 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69  ared, but freeli
18f30 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  st deleted conte
18f40 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  nt is not..**.**
18f50 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45   With BTS_SECURE
18f60 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69  _DELETE, operati
18f70 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f  on is like BTS_O
18f80 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68  VERWRITE with th
18f90 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68  e addition.** th
18fa0 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  at freelist leaf
18fb0 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
18fc0 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
18fd0 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65   database, incre
18fe0 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f  asing.** the amo
18ff0 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e  unt of disk I/O.
19000 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19010 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
19020 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
19030 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
19040 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
19050 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
19060 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19070 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f  .  assert( BTS_O
19080 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45  VERWRITE==BTS_SE
19090 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b  CURE_DELETE*2 );
190a0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46  .  assert( BTS_F
190b0 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53  AST_SECURE==(BTS
190c0 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53  _OVERWRITE|BTS_S
190d0 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b  ECURE_DELETE) );
190e0 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
190f0 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
19100 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
19110 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20  S_FAST_SECURE;. 
19120 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
19130 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
19140 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67  E_DELETE*newFlag
19150 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e  ;.  }.  b = (p->
19160 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
19170 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29  BTS_FAST_SECURE)
19180 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  /BTS_SECURE_DELE
19190 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  TE;.  sqlite3Btr
191a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
191b0 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
191c0 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
191d0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
191e0 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
191f0 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
19200 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
19210 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
19220 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
19230 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
19240 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
19250 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
19260 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
19270 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
19280 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
19290 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
192a0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
192b0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
192c0 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
192d0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
192e0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
192f0 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
19300 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
19310 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
19320 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
19330 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
19340 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
19350 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
19360 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19370 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
19380 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
19390 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
193a0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
193b0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
193c0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
193d0 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
193e0 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
193f0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
19400 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
19410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
19420 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
19430 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
19440 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
19450 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
19460 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19470 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
19480 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
19490 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
194a0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
194b0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
194c0 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
194d0 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
194e0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
194f0 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
19500 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
19510 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
19520 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
19530 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19540 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
19550 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
19560 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
19570 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
19580 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19590 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
195a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
195b0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
195c0 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
195d0 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
195e0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
195f0 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
19600 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
19610 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
19620 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
19640 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  dif.}../*.** If 
19650 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74  the user has not
19660 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d   set the safety-
19670 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64  level for this d
19680 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
19690 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41  on.** using "PRA
196a0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22  GMA synchronous"
196b0 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66  , and if the saf
196c0 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74  ety-level is not
196d0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
196e0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
196f0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
19700 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f  tion as the seco
19710 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a  nd parameter,.**
19720 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23   set it so..*/.#
19730 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
19740 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
19750 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
19760 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a  L_SYNCHRONOUS \.
19770 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28      && !defined(
19780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
19790 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
197a0 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
197b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75  BtShared *pBt, u
197c0 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b  8 safety_level){
197d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
197e0 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28    Db *pDb;.  if(
197f0 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30   (db=pBt->db)!=0
19800 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62   && (pDb=db->aDb
19810 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  )!=0 ){.    whil
19820 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c  e( pDb->pBt==0 |
19830 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21  | pDb->pBt->pBt!
19840 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d  =pBt ){ pDb++; }
19850 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53  .    if( pDb->bS
19860 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20  yncSet==0 .     
19870 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
19880 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76  evel!=safety_lev
19890 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21  el .     && pDb!
198a0 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20  =&db->aDb[1] .  
198b0 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e    ){.      pDb->
198c0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73  safety_level = s
198d0 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20  afety_level;.   
198e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
198f0 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
19900 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ger,.          p
19910 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
19920 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
19930 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
19940 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
19950 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
19960 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
19970 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76  g(pBt,safety_lev
19980 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46  el).#endif../* F
19990 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
199a0 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
199b0 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
199c0 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  hared*);.../*.**
199d0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
199e0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
199f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
19a00 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
19a10 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
19a20 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
19a30 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
19a40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
19a50 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
19a60 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
19a70 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
19a80 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
19a90 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
19aa0 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
19ab0 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
19ac0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19ad0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
19ae0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
19af0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
19b00 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
19b10 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
19b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
19b30 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
19b40 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b60 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
19b70 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
19b80 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
19b90 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
19ba0 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
19bb0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32  se file */.  u32
19bc0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
19bd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19be0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
19bf0 62 61 73 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50  base */.  u32 nP
19c00 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
19c10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19c20 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
19c30 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20  e file */.  u32 
19c40 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
19c50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
19c60 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
19c70 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
19c80 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
19c90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
19ca0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19cb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
19cc0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
19cd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
19ce0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
19cf0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
19d00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19d10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19d20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
19d30 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
19d40 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
19d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19d60 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
19d70 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
19d80 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
19d90 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
19da0 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
19db0 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
19dc0 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
19dd0 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
19de0 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
19df0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
19e00 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
19e10 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
19e20 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 2a  t->pPager, (int*
19e30 29 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20  )&nPageFile);.  
19e40 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
19e50 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
19e60 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
19e70 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
19e80 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
19e90 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
19ea0 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  le;.  }.  if( (p
19eb0 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
19ec0 53 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61  SQLITE_ResetData
19ed0 62 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  base)!=0 ){.    
19ee0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  nPage = 0;.  }. 
19ef0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
19f00 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
19f10 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
19f20 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
19f30 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
19f40 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
19f50 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
19f60 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19f70 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45   R-43737-39999 E
19f80 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74  very valid SQLit
19f90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19fa0 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69  begins.    ** wi
19fb0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
19fc0 20 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65   16 bytes (in he
19fd0 78 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20  x): 53 51 4c 69 
19fe0 37 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37  74 65 20 66 6f 7
19ff0 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37  2 6d.    ** 61 7
1a000 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20  4 20 33 00. */. 
1a010 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
1a020 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
1a030 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
1a040 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1a050 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1a060 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a070 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
1a080 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
1a090 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1a0a0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
1a0b0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
1a0c0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
1a0d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1a0e0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1a0f0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
1a100 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
1a110 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
1a120 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
1a130 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
1a140 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
1a150 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
1a160 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1a170 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
1a180 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
1a190 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
1a1a0 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
1a1b0 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
1a1c0 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
1a1d0 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
1a1e0 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
1a1f0 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
1a200 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
1a210 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
1a220 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
1a230 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
1a240 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
1a250 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
1a260 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
1a270 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
1a280 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
1a290 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
1a2a0 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
1a2b0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
1a2c0 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
1a2d0 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
1a2e0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
1a2f0 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
1a300 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
1a310 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
1a320 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
1a330 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
1a340 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
1a350 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
1a360 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
1a370 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
1a380 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
1a390 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a3a0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
1a3b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
1a3c0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
1a3d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a3e0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
1a3f0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1a400 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a410 20 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c         setDefaul
1a420 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53  tSyncFlag(pBt, S
1a430 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
1a440 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  L_SYNCHRONOUS+1)
1a450 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
1a460 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
1a470 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1a480 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  One(pPage1);.   
1a490 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1a4a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1a4b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1a4c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
1a4d0 41 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ADB;.    }else{.
1a4e0 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74        setDefault
1a4f0 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51  SyncFlag(pBt, SQ
1a500 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
1a510 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20  CHRONOUS+1);.   
1a520 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1a530 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a540 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65  -15465-20813 The
1a550 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e   maximum and min
1a560 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61  imum embedded pa
1a570 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61  yload.    ** fra
1a580 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c  ctions and the l
1a590 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63  eaf payload frac
1a5a0 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74  tion values must
1a5b0 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20   be 64, 32, and 
1a5c0 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  32..    **.    *
1a5d0 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
1a5e0 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
1a5f0 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
1a600 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
1a610 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
1a620 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
1a630 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
1a640 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a650 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
1a660 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
1a670 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
1a680 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1a690 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1a6a0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a6b0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
1a6c0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
1a6d0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
1a6e0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
1a6f0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1a700 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
1a710 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
1a720 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
1a730 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
1a740 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1a750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a760 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20  */.    pageSize 
1a770 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
1a780 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
1a790 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  6);.    /* EVIDE
1a7a0 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d  NCE-OF: R-25008-
1a7b0 32 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f  21688 The size o
1a7c0 66 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f  f a page is a po
1a7d0 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a  wer of two.    *
1a7e0 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  * between 512 an
1a7f0 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76  d 65536 inclusiv
1a800 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28  e. */.    if( ((
1a810 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
1a820 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c  Size)!=0.     ||
1a830 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
1a840 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a  _MAX_PAGE_SIZE .
1a850 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
1a860 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20  <=256 .    ){.  
1a870 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1a880 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1a890 7d 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  }.    pBt->btsFl
1a8a0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
1a8b0 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 20 20 61  IZE_FIXED;.    a
1a8c0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
1a8d0 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
1a8e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a8f0 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68  R-59310-51205 Th
1a900 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63  e "reserved spac
1a910 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31  e" size in the 1
1a920 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74  -byte.    ** int
1a930 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32  eger at offset 2
1a940 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  0 is the number 
1a950 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
1a960 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  e at the end of.
1a970 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65      ** each page
1a980 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
1a990 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20  extensions. .   
1a9a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45   **.    ** EVIDE
1a9b0 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d  NCE-OF: R-37497-
1a9c0 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f  42412 The size o
1a9d0 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72  f the reserved r
1a9e0 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20  egion is.    ** 
1a9f0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1aa00 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
1aa10 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
1aa20 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
1aa30 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  f 20.    ** into
1aa40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1aa50 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
1aa60 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
1aa70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
1aa80 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33  20];.    if( (u3
1aa90 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  2)pageSize!=pBt-
1aaa0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
1aab0 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
1aac0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1aad0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1aae0 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
1aaf0 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
1ab00 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
1ab10 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
1ab20 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
1ab30 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
1ab40 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
1ab50 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
1ab60 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
1ab70 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1ab80 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
1ab90 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
1aba0 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
1abb0 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
1abc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
1abd0 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
1abe0 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
1abf0 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
1ac00 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1ac10 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20  geOne(pPage1);. 
1ac20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
1ac30 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
1ac40 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
1ac50 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1ac60 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
1ac70 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
1ac80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ac90 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
1aca0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
1acb0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ace0 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
1acf0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
1ad00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1ad10 20 69 66 28 20 73 71 6c 69 74 65 33 57 72 69 74   if( sqlite3Writ
1ad20 61 62 6c 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  ableSchema(pBt->
1ad30 64 62 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  db)==0 && nPage>
1ad40 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
1ad50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1ad60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1ad70 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1ad80 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1ad90 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1ada0 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
1adb0 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
1adc0 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
1add0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
1ade0 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
1adf0 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
1ae00 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
1ae10 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
1ae20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
1ae30 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
1ae40 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
1ae50 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
1ae60 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
1ae70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1ae80 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1ae90 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1aea0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
1aeb0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
1aec0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
1aed0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
1aee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1aef0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
1af00 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
1af10 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
1af20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
1af30 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
1af40 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
1af50 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
1af60 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
1af70 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
1af80 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
1af90 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
1afa0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
1afb0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
1afc0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
1afd0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
1afe0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
1aff0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
1b000 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
1b010 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
1b020 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
1b030 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
1b040 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
1b050 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
1b060 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
1b070 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
1b080 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
1b090 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
1b0a0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
1b0b0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
1b0c0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
1b0d0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
1b0e0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
1b0f0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
1b100 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
1b110 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
1b120 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
1b130 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
1b140 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
1b150 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
1b160 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
1b170 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
1b180 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
1b190 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
1b1a0 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
1b1b0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
1b1c0 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
1b1d0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1b1e0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
1b1f0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
1b200 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
1b210 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1b220 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
1b230 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
1b240 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
1b250 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
1b260 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
1b270 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
1b280 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1b290 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
1b2a0 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
1b2b0 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
1b2c0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
1b2d0 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
1b2e0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
1b2f0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
1b300 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
1b310 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1b320 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
1b330 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
1b340 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
1b350 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
1b360 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1b370 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1b380 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
1b390 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
1b3a0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70  releasePageOne(p
1b3b0 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
1b3c0 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
1b3d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1b3e0 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
1b3f0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1b400 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65  r of cursors ope
1b410 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69  n on pBt. This i
1b420 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
1b430 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
1b440 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
1b450 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
1b460 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
1b470 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
1b480 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
1b490 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69  rs are counted i
1b4a0 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65  f wrOnly is true
1b4b0 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a  .  If wrOnly is.
1b4c0 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c  ** false then al
1b4d0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  l cursors are co
1b4e0 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  unted..**.** For
1b4f0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
1b500 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
1b510 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63   cursor is any c
1b520 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
1b530 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64   capable of read
1b540 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1b550 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1b560 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
1b570 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
1b580 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
1b590 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
1b5a0 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
1b5b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1b5c0 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
1b5d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
1b5e0 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
1b5f0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
1b600 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
1b610 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
1b620 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
1b630 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
1b640 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
1b650 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
1b660 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
1b670 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
1b680 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
1b690 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
1b6a0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
1b6b0 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
1b6c0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
1b6d0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1b6e0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
1b6f0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
1b700 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
1b710 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
1b720 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
1b730 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1b740 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
1b750 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
1b760 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1b770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b780 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
1b790 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
1b7a0 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
1b7b0 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
1b7c0 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
1b7d0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1b7e0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
1b7f0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1b800 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
1b810 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1b820 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1b830 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1b840 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1b850 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1b860 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
1b870 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
1b880 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
1b890 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
1b8a0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
1b8b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b8c0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
1b8d0 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
1b8e0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1b8f0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1b900 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e1;.    assert( 
1b910 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
1b920 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1b930 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1b940 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
1b950 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  1 );.    pBt->pP
1b960 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65  age1 = 0;.    re
1b970 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61  leasePageOne(pPa
1b980 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
1b990 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
1b9a0 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
1b9b0 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
1b9c0 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
1b9d0 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
1b9e0 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
1b9f0 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
1ba00 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
1ba10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1ba20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
1ba30 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
1ba40 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
1ba50 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
1ba60 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
1ba70 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1ba80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ba90 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1baa0 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
1bab0 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
1bac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bad0 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
1bae0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
1baf0 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
1bb00 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
1bb10 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
1bb20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1bb30 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
1bb40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1bb50 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
1bb60 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
1bb70 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1bb80 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
1bb90 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1bba0 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
1bbb0 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
1bbc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
1bbd0 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
1bbe0 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
1bbf0 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
1bc00 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
1bc10 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
1bc20 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
1bc30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
1bc40 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
1bc50 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
1bc60 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
1bc70 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
1bc80 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
1bc90 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
1bca0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
1bcb0 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
1bcc0 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
1bcd0 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
1bce0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
1bcf0 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
1bd00 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
1bd10 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
1bd20 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
1bd30 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
1bd40 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
1bd50 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
1bd60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1bd70 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
1bd80 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1bd90 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
1bda0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
1bdb0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
1bdc0 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
1bdd0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
1bde0 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
1bdf0 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
1be00 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1be10 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
1be20 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
1be30 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
1be40 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
1be50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
1be60 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
1be70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1be80 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1be90 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1bea0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1beb0 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
1bec0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1bed0 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
1bee0 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
1bef0 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
1bf00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1bf10 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
1bf20 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
1bf30 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
1bf40 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
1bf50 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
1bf60 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1bf70 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1bf80 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
1bf90 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
1bfa0 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
1bfb0 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
1bfc0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1bfd0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1bfe0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
1bff0 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
1c000 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
1c010 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1c020 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
1c030 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
1c040 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
1c050 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
1c060 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
1c070 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
1c080 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1c090 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
1c0a0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
1c0b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1c0c0 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
1c0d0 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
1c0e0 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
1c0f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1c100 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
1c110 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
1c120 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
1c130 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
1c140 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
1c150 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
1c160 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
1c170 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
1c180 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
1c190 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
1c1a0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1c1b0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1c1c0 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
1c1d0 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
1c1e0 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
1c1f0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1c200 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
1c210 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
1c220 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
1c230 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
1c240 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1c250 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
1c260 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1c270 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
1c280 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1c290 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
1c2a0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1c2b0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
1c2c0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1c2d0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
1c2e0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1c2f0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
1c300 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1c310 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
1c320 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1c330 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
1c340 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
1c350 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
1c360 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
1c370 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
1c380 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
1c390 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
1c3a0 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
1c3b0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
1c3c0 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
1c3d0 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
1c3e0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
1c3f0 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
1c400 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
1c410 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
1c420 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
1c430 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
1c440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1c450 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
1c460 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
1c470 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1c480 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
1c490 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
1c4a0 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
1c4b0 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
1c4c0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
1c4d0 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
1c4e0 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
1c4f0 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
1c500 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1c510 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
1c520 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
1c530 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
1c540 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
1c550 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
1c560 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
1c570 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
1c580 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
1c590 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
1c5a0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
1c5b0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
1c5c0 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
1c5d0 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
1c5e0 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
1c5f0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1c600 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
1c610 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
1c620 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
1c630 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1c640 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
1c650 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
1c660 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
1c670 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
1c680 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1c690 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
1c6a0 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 2c 20 69  p, int wrflag, i
1c6b0 6e 74 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69  nt *pSchemaVersi
1c6c0 6f 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  on){.  BtShared 
1c6d0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1c6e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c6f0 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
1c700 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1c710 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1c720 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1c730 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
1c740 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
1c750 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
1c760 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
1c770 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
1c780 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
1c790 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
1c7a0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1c7b0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
1c7c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1c7d0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1c7e0 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
1c7f0 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
1c800 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
1c810 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1c820 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1c830 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c840 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1c850 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   || IfNotOmitAV(
1c860 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1c870 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  )==0 );..  if( (
1c880 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
1c890 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62  QLITE_ResetDatab
1c8a0 61 73 65 29 20 0a 20 20 20 26 26 20 73 71 6c 69  ase) .   && sqli
1c8b0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
1c8c0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  ly(pBt->pPager)=
1c8d0 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 70 42 74  =0 .  ){.    pBt
1c8e0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1c8f0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
1c900 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  }..  /* Write tr
1c910 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
1c920 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
1c930 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
1c940 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ase */.  if( (pB
1c950 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1c960 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1c970 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1c980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1c990 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
1c9a0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1c9b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c9c0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1c9d0 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  HE.  {.    sqlit
1c9e0 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
1c9f0 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65      /* If anothe
1ca00 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
1ca10 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
1ca20 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
1ca30 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  nsaction .    **
1ca40 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
1ca50 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
1ca60 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
1ca70 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1ca80 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74  s.    ** request
1ca90 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
1caa0 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f  E_LOCKED..    */
1cab0 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c 61 67  .    if( (wrflag
1cac0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1cad0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1cae0 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 42  ITE).     || (pB
1caf0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1cb00 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20  S_PENDING)!=0.  
1cb10 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63    ){.      pBloc
1cb20 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72  k = pBt->pWriter
1cb30 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->db;.    }else 
1cb40 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
1cb50 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49        BtLock *pI
1cb60 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ter;.      for(p
1cb70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
1cb80 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
1cb90 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
1cba0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
1cbb0 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
1cbc0 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
1cbd0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
1cbe0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  b;.          bre
1cbf0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1cc00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1cc10 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
1cc20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
1cc30 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
1cc40 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
1cc50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
1cc60 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
1cc70 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72  E;.      goto tr
1cc80 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d  ans_begun;.    }
1cc90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1cca0 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20  * Any read-only 
1ccb0 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72  or read-write tr
1ccc0 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65  ansaction implie
1ccd0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
1cce0 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53   .  ** page 1. S
1ccf0 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  o if some other 
1cd00 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69  shared-cache cli
1cd10 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20  ent already has 
1cd20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20  a write-lock .  
1cd30 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  ** on page 1, th
1cd40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e transaction ca
1cd50 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20  nnot be opened. 
1cd60 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53  */.  rc = queryS
1cd70 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1cd80 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
1cd90 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OT, READ_LOCK);.
1cda0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1cdb0 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73  =rc ) goto trans
1cdc0 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e  _begun;..  pBt->
1cdd0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1cde0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1cdf0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
1ce00 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73  ge==0 ) pBt->bts
1ce10 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49  Flags |= BTS_INI
1ce20 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1ce30 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  do {.    /* Call
1ce40 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74   lockBtree() unt
1ce50 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70  il either pBt->p
1ce60 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74  Page1 is populat
1ce70 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63  ed or.    ** loc
1ce80 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73  kBtree() returns
1ce90 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
1cea0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
1ceb0 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20   lockBtree().   
1cec0 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
1ced0 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
1cee0 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73  ve pBt->pPage1 s
1cef0 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72  et to 0 if after
1cf00 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
1cf10 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76  page 1 it discov
1cf20 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ers that the pag
1cf30 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e-size of the da
1cf40 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66  tabase .    ** f
1cf50 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e  ile is not pBt->
1cf60 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69  pageSize. In thi
1cf70 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65  s case lockBtree
1cf80 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20  () will update. 
1cf90 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53     ** pBt->pageS
1cfa0 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ize to the page-
1cfb0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1cfc0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   on disk..    */
1cfd0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
1cfe0 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51  >pPage1==0 && SQ
1cff0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c  LITE_OK==(rc = l
1d000 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29  ockBtree(pBt)) )
1d010 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
1d020 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1d030 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
1d040 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1d050 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1d060 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1d070 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1d080 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
1d090 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1d0a0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1d0b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
1d0c0 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
1d0d0 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
1d0e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d0f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d100 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
1d110 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1d120 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1d130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1d140 59 5f 53 4e 41 50 53 48 4f 54 20 26 26 20 70 42  Y_SNAPSHOT && pB
1d150 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1d160 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1d170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
1d180 74 68 65 72 65 20 77 61 73 20 6e 6f 20 74 72 61  there was no tra
1d190 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
1d1a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1d1b0 6f 6e 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  on was.         
1d1c0 20 2a 2a 20 63 61 6c 6c 65 64 20 61 6e 64 20 53   ** called and S
1d1d0 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
1d1e0 48 4f 54 20 69 73 20 72 65 74 75 72 6e 65 64 2c  HOT is returned,
1d1f0 20 63 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f   change the erro
1d200 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1d210 6f 64 65 20 74 6f 20 53 51 4c 49 54 45 5f 42 55  ode to SQLITE_BU
1d220 53 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  SY. */.         
1d230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1d240 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
1d250 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1d260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
1d280 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1d290 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
1d2a0 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
1d2b0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
1d2c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1d2d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1d2e0 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
1d2f0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
1d300 6c 65 72 28 70 42 74 29 20 29 3b 0a 20 20 73 71  ler(pBt) );.  sq
1d310 6c 69 74 65 33 50 61 67 65 72 52 65 73 65 74 4c  lite3PagerResetL
1d320 6f 63 6b 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e  ockTimeout(pBt->
1d330 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
1d340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d350 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1d360 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1d370 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
1d380 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
1d390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d3a0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1d3b0 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
1d3c0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
1d3d0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
1d3e0 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
1d3f0 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
1d400 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1d410 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
1d420 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
1d430 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
1d440 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
1d450 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
1d460 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
1d470 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
1d480 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
1d490 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
1d4a0 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
1d4b0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1d4c0 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
1d4d0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
1d4e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1d4f0 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
1d500 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
1d510 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  lag ){.      Mem
1d520 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1d530 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e  Bt->pPage1;.#ifn
1d540 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d550 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1d560 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
1d570 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
1d580 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
1d590 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   p;.      pBt->b
1d5a0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1d5b0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
1d5c0 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20   if( wrflag>1 ) 
1d5d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1d5e0 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a   BTS_EXCLUSIVE;.
1d5f0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
1d600 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20   If the db-size 
1d610 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
1d620 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74  incorrect (as it
1d630 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c   may be if an ol
1d640 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e  d.      ** clien
1d650 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69  t has been writi
1d660 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
1d670 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74  file), update it
1d680 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20   now. Doing.    
1d690 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72    ** this sooner
1d6a0 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
1d6b0 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  er means the dat
1d6c0 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73  abase size can s
1d6d0 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20  afely .      ** 
1d6e0 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61  re-read the data
1d6f0 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70  base size from p
1d700 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70  age 1 if a savep
1d710 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  oint or transact
1d720 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  ion.      ** rol
1d730 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74  lback occurs wit
1d740 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hin the transact
1d750 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1d760 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
1d770 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50  ge!=get4byte(&pP
1d780 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29  age1->aData[28])
1d790 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d7a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d7b0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1d7c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1d7d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d7e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1d7f0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d800 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1d810 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
1d820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d830 7d 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  }..trans_begun:.
1d840 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d850 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1d860 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b  SchemaVersion ){
1d870 0a 20 20 20 20 20 20 2a 70 53 63 68 65 6d 61 56  .      *pSchemaV
1d880 65 72 73 69 6f 6e 20 3d 20 67 65 74 34 62 79 74  ersion = get4byt
1d890 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1d8a0 61 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20  aData[40]);.    
1d8b0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1d8c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1d8d0 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
1d8e0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
1d8f0 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
1d900 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
1d910 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
1d920 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
1d930 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1d940 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
1d950 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
1d960 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  sub-journal is n
1d970 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
1d980 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65   then it will be
1d990 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20   opened here..  
1d9a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
1d9b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1d9c0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1d9d0 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
1d9e0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
1d9f0 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49   }.  }..  btreeI
1da00 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1da10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1da20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1da30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1da40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1da50 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1da60 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1da70 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1da80 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1da90 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1daa0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1dab0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1dac0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1dad0 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1dae0 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1daf0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1db00 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1db10 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1db20 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1db30 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1db40 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1db70 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1db80 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dbb0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1dbc0 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1dbd0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dbf0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1dc00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1dc10 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1dc20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1dc30 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1dc40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1dc50 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1dc60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1dc70 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  c = pPage->isIni
1dc80 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  t ? SQLITE_OK : 
1dc90 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1dca0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1dcb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1dcc0 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d  rn rc;.  nCell =
1dcd0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1dce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1dcf0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
1dd00 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1dd10 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
1dd20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
1dd30 50 74 72 28 70 50 61 67 65 2c 20 70 50 61 67 65  Ptr(pPage, pPage
1dd40 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
1dd50 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1dd60 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
1dd70 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1dd80 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
1dd90 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1dda0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1ddb0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1ddc0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
1ddd0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1dde0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
1ddf0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1de00 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1de10 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1de20 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1de30 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1de40 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1de50 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1de60 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc);.  }..  retu
1de70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1de80 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
1de90 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
1dea0 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
1deb0 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
1dec0 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
1ded0 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
1dee0 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
1def0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
1df00 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
1df10 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
1df20 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
1df30 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
1df40 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
1df50 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1df60 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1df70 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
1dfa0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1dfb0 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
1dfc0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1dfd0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1dfe0 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
1dff0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1e000 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
1e010 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
1e020 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
1e030 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1e040 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
1e050 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1e060 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
1e070 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
1e080 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
1e090 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
1e0a0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1e0b0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1e0c0 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
1e0d0 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
1e0e0 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
1e0f0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
1e100 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
1e110 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1e120 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1e130 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1e140 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1e150 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
1e160 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
1e170 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1e180 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
1e190 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
1e1a0 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
1e1b0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1e1c0 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
1e1d0 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
1e1e0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1e1f0 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
1e200 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
1e210 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e220 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
1e230 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
1e240 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
1e250 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
1e260 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1e270 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  nt nCell;.    in
1e280 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20  t rc;..    rc = 
1e290 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20  pPage->isInit ? 
1e2a0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65  SQLITE_OK : btre
1e2b0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1e2c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e2d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
1e2e0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1e2f0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
1e300 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1e310 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
1e320 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1e330 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
1e340 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1e350 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
1e360 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1e370 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  o;.        pPage
1e380 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
1e390 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1e3a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1e3b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
1e3c0 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
1e3d0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b        if( pCell+
1e3e0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61  info.nSize > pPa
1e3f0 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
1e400 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1e410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e430 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
1e440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1e450 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
1e460 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65  om==get4byte(pCe
1e470 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29  ll+info.nSize-4)
1e480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e490 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  put4byte(pCell+i
1e4a0 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f  nfo.nSize-4, iTo
1e4b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
1e4c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1e4d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e4e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e4f0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
1e500 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
1e510 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1e520 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
1e530 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1e540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e550 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1e560 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
1e570 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
1e580 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1e590 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
1e5a0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1e5b0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1e5c0 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
1e5d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e5e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1e5f0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
1e600 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
1e610 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1e620 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1e630 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
1e640 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1e650 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
1e660 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
1e670 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1e680 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
1e690 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
1e6a0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
1e6b0 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
1e6c0 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
1e6d0 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
1e6e0 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
1e6f0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1e700 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
1e710 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
1e720 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1e730 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
1e740 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
1e750 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1e760 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
1e770 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
1e780 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1e790 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
1e7a0 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
1e7b0 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
1e7c0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
1e7d0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
1e7e0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1e7f0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
1e800 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
1e810 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
1e820 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
1e830 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e850 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
1e860 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
1e870 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1e880 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
1e890 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
1e8a0 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
1e8b0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
1e8c0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
1e8d0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
1e8e0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
1e8f0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
1e900 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1e910 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1e920 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
1e930 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1e940 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
1e950 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
1e960 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
1e970 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
1e980 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
1e990 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
1e9a0 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
1e9b0 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
1e9c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1e9d0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
1e9e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1e9f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1ea00 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
1ea10 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1ea20 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
1ea30 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1ea40 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1ea50 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
1ea60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ea70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1ea80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1ea90 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
1eaa0 74 3d 3d 70 42 74 20 29 3b 0a 20 20 69 66 28 20  t==pBt );.  if( 
1eab0 69 44 62 50 61 67 65 3c 33 20 29 20 72 65 74 75  iDbPage<3 ) retu
1eac0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ead0 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f  T_BKPT;..  /* Mo
1eae0 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1eaf0 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1eb00 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1eb10 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1eb20 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1eb30 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1eb40 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1eb50 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1eb60 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1eb70 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1eb80 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1eb90 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1eba0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ebb0 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1ebc0 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1ebd0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1ebe0 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1ebf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ec00 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1ec10 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1ec20 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1ec30 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1ec40 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1ec50 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1ec60 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1ec70 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1ec80 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1ec90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1eca0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1ecb0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1ecc0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1ecd0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1ece0 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1ecf0 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1ed00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1ed10 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1ed20 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1ed30 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1ed40 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1ed50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1ed60 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1ed70 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1ed80 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1ed90 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1eda0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1edb0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1edc0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1edd0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1ede0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1edf0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1ee00 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1ee10 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1ee20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ee30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ee40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ee50 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1ee60 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1ee70 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1ee80 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1ee90 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1eea0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1eeb0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1eec0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1eed0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1eee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1eef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ef00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ef10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ef20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1ef30 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1ef40 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1ef50 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1ef60 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1ef70 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1ef80 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1ef90 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1efa0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1efb0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1efc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1efd0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1efe0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1eff0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1f000 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1f010 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1f020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f030 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f040 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1f050 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f060 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1f070 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1f080 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f090 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1f0a0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1f0b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f0c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1f0d0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1f0e0 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1f0f0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1f100 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1f110 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1f120 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f140 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1f150 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1f160 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1f170 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1f180 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1f190 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1f1a0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1f1b0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1f1c0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1f1d0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1f1e0 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
1f1f0 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
1f200 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
1f210 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
1f220 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
1f230 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1f240 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
1f250 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
1f260 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
1f270 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
1f280 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
1f290 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
1f2a0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1f2b0 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
1f2c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1f2d0 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
1f2e0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
1f2f0 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
1f300 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1f310 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
1f320 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
1f330 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1f340 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
1f350 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
1f360 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1f370 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
1f380 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1f390 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
1f3a0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
1f3b0 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
1f3c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1f3d0 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
1f3e0 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
1f3f0 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
1f400 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
1f410 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1f420 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
1f430 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
1f440 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
1f450 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
1f460 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1f470 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
1f480 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
1f490 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
1f4a0 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
1f4b0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1f4c0 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
1f4d0 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
1f4e0 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
1f4f0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
1f500 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
1f510 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
1f520 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
1f530 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
1f540 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
1f550 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
1f560 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
1f570 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
1f580 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
1f590 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
1f5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f5b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
1f5c0 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
1f5d0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
1f5e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1f5f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1f600 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1f610 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
1f620 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
1f630 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1f640 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
1f650 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
1f660 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f670 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
1f680 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
1f690 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
1f6a0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
1f6b0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f6c0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
1f6d0 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
1f6e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f6f0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
1f700 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1f710 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
1f720 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
1f730 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1f740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f750 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f760 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
1f770 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1f780 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
1f790 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f7a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1f7b0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1f7c0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1f7d0 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
1f7e0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1f7f0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1f800 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
1f810 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
1f820 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1f830 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1f840 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
1f850 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
1f860 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
1f870 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
1f880 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
1f890 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
1f8a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1f8b0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
1f8c0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
1f8d0 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
1f8e0 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
1f8f0 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
1f900 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1f910 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1f920 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
1f930 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1f940 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1f950 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1f960 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1f970 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
1f980 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
1f990 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f9a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f9b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f9c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f9d0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1f9e0 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
1f9f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1fa00 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1fa10 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
1fa20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1fa30 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
1fa40 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
1fa50 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
1fa60 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
1fa70 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
1fa80 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
1fa90 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
1faa0 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
1fab0 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1fac0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1fad0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
1fae0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1faf0 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
1fb00 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1fb10 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1fb20 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
1fb30 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
1fb40 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
1fb50 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1fb60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1fb70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1fb80 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1fb90 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
1fba0 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
1fbb0 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
1fbc0 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
1fbd0 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
1fbe0 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
1fbf0 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1fc00 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
1fc10 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
1fc20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
1fc30 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1fc40 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
1fc50 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1fc60 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
1fc70 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
1fc80 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
1fc90 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
1fca0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
1fcb0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
1fcc0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
1fcd0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1fce0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1fcf0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
1fd00 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
1fd10 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
1fd20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
1fd30 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1fd40 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1fd50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1fd60 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1fd70 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1fd80 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
1fd90 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
1fda0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fdb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1fdc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1fdd0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
1fde0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fdf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1fe00 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1fe10 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
1fe20 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
1fe30 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
1fe40 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1fe50 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
1fe60 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
1fe70 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
1fe80 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
1fe90 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
1fea0 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
1feb0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1fec0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1fed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1fef0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1ff00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1ff10 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1ff20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
1ff30 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
1ff40 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
1ff50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ff60 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
1ff70 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1ff80 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
1ff90 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1ffa0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
1ffb0 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
1ffc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ffd0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1ffe0 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1fff0 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
20000 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
20010 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
20020 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
20030 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
20040 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
20050 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
20060 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
20070 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20080 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
20090 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
200a0 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
200b0 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
200c0 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
200d0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
200e0 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
200f0 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20120 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
20130 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
20140 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20160 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
20170 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
20180 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
20190 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201b0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
201c0 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
201d0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
201e0 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
201f0 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
20200 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
20210 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
20220 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
20230 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
20240 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
20250 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20260 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
20270 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20280 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
20290 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
202a0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
202b0 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
202c0 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
202d0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
202e0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
202f0 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
20300 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
20310 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
20320 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
20330 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
20340 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
20350 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
20360 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
20370 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
20380 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
20390 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
203a0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
203b0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
203c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
203d0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
203e0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
203f0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
20400 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
20410 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
20420 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
20430 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
20440 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
20450 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
20460 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
20470 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
20480 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
20490 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
204a0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
204b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
204c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
204d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
204e0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
204f0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20500 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
20510 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
20520 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
20530 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
20540 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
20550 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
20560 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
20570 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
20580 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
20590 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
205a0 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
205b0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
205c0 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
205d0 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
205e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
205f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20600 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
20610 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
20620 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
20630 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
20640 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
20650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20660 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
20670 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
20680 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
20690 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
206a0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
206b0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
206c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
206d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
206e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
206f0 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
20700 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
20710 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
20720 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
20730 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
20740 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
20750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20760 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
20770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
20780 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20790 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
207a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
207b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
207c0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
207d0 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
207e0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
207f0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
20800 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
20810 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
20820 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
20830 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
20840 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
20850 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
20860 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
20870 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
20880 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
20890 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
208a0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
208b0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
208c0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
208d0 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
208e0 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
208f0 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
20900 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
20910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
20920 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
20930 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
20940 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20950 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
20960 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
20970 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
20980 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
20990 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
209a0 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73  pPager); )..  as
209b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
209c0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
209d0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
209e0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
209f0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
20a00 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
20a10 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
20a20 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
20a30 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
20a40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20a50 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
20a60 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
20a70 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
20a80 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
20a90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20aa0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
20ab0 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
20ac0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
20ad0 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
20ae0 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
20af0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
20b00 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
20b10 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
20b20 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
20b30 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
20b40 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
20b50 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
20b60 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
20b70 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
20b80 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
20b90 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
20ba0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
20bb0 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
20bc0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
20bd0 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
20be0 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
20bf0 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
20c00 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
20c10 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
20c20 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
20c30 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
20c40 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
20c50 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
20c60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20c80 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
20c90 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
20ca0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
20cb0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
20cc0 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
20cd0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
20ce0 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
20cf0 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
20d00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20d10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20d20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
20d30 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
20d40 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
20d50 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
20d60 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
20d70 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
20d80 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
20d90 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
20da0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
20db0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
20dc0 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
20dd0 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
20de0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
20df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
20e00 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
20e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20e20 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
20e30 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
20e40 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
20e50 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
20e60 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
20e70 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
20e80 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
20e90 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
20ea0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
20eb0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
20ec0 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
20ed0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
20ee0 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
20ef0 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
20f00 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
20f10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
20f30 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
20f40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
20f50 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
20f60 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
20f70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
20f80 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
20f90 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
20fa0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20fb0 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
20fc0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
20fd0 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
20fe0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
20ff0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
21000 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
21010 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
21020 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
21030 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
21040 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
21050 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
21060 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
21070 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
21080 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
21090 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
210a0 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
210b0 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
210c0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
210d0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
210e0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
210f0 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
21100 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
21110 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
21120 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
21130 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
21140 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
21150 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
21160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
21170 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
21180 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
21190 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
211a0 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
211b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
211c0 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
211d0 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
211e0 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
211f0 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
21200 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
21210 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
21220 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
21230 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
21240 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
21250 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
21260 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
21270 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
21280 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
21290 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
212a0 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
212b0 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
212c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
212d0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
212e0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
212f0 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
21300 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
21310 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
21320 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
21330 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
21340 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
21350 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
21360 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
21370 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
21380 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
21390 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
213a0 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
213b0 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
213c0 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
213d0 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
213e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
213f0 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
21400 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
21410 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
21420 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
21430 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
21440 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
21450 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
21460 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
21470 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
21480 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
21490 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
214a0 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
214b0 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
214c0 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
214d0 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
214e0 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
214f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
21500 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
21510 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
21520 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
21530 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21540 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
21550 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
21560 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
21570 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
21580 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
21590 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
215a0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
215b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
215c0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
215d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
215e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
215f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
21600 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
21610 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
21620 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
21630 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
21640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
21660 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21670 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
21680 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
21690 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
216a0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
216b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
216c0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
216d0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
216e0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
216f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
21700 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
21710 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
21720 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
21730 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
21740 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21750 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
21770 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
21780 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
21790 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
217a0 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
217b0 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
217c0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
217d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
217e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
217f0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
21800 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
21810 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21820 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
21830 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
21840 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
21850 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
21860 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
21870 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21880 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
21890 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
218a0 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
218b0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
218c0 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
218d0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
218e0 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
218f0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
21900 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
21910 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
21920 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
21930 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
21940 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
21950 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
21960 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
21970 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
21980 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
21990 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
219a0 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
219b0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
219c0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
219d0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
219e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
219f0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
21a00 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
21a10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
21a20 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
21a30 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
21a40 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
21a50 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
21a60 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
21a70 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
21a80 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
21a90 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
21aa0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
21ab0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
21ac0 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
21ad0 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
21ae0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
21af0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
21b00 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
21b10 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
21b20 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
21b30 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
21b40 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
21b50 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
21b60 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
21b70 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
21b80 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
21b90 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
21ba0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
21bb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
21bc0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
21bd0 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
21be0 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
21bf0 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
21c00 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
21c10 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
21c20 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
21c30 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
21c40 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
21c50 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
21c60 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
21c70 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
21c80 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
21c90 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
21ca0 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
21cb0 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
21cc0 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
21cd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21ce0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
21cf0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
21d00 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
21d10 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
21d20 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
21d30 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
21d40 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
21d50 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
21d60 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
21d70 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
21d80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
21d90 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
21da0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
21db0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
21dc0 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
21dd0 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
21de0 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
21df0 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
21e00 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
21e10 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
21e20 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
21e30 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
21e40 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
21e50 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
21e60 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
21e70 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
21e80 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
21e90 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
21ea0 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
21eb0 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
21ec0 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
21ed0 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
21ee0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
21ef0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
21f00 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  rs while the pag
21f10 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65  er layer is atte
21f20 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69  mpting to .** fi
21f30 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  nalize the under
21f40 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69  lying journal fi
21f50 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
21f60 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
21f70 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70  or and.** the up
21f80 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61  per layer will a
21f90 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
21fa0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
21fb0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
21fc0 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  nt.** is non-zer
21fd0 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72  o then this b-tr
21fe0 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ee transaction i
21ff0 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  s part of a mult
22000 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73  i-file .** trans
22010 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
22020 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61  case, the transa
22030 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
22040 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  y been committed
22050 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e   .** (by deletin
22060 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
22070 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
22080 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e   caller will ign
22090 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
220a0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f  ctions return co
220b0 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20  de. So, even if 
220c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
220d0 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  in the pager lay
220e0 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  er,.** reset the
220f0 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20   b-tree objects 
22100 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74  internal state t
22110 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
22120 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61  the write.** tra
22130 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nsaction has bee
22140 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69  n closed. This i
22150 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73  s quite safe, as
22160 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
22170 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69  have.** transiti
22180 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f  oned to the erro
22190 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  r state..**.** T
221a0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
221b0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
221c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
221d0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
221e0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
221f0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
22200 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
22210 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
22220 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
22230 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
22240 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e  e *p, int bClean
22250 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  up){..  if( p->i
22260 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
22270 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  NE ) return SQLI
22280 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
22290 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
222a0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
222b0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
222c0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
222d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
222e0 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
222f0 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
22300 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
22310 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
22320 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
22330 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
22340 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
22350 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
22360 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
22370 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
22380 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
22390 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
223a0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
223b0 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
223c0 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
223d0 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
223e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
223f0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
22400 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
22410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22420 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20   && bCleanup==0 
22430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22440 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
22450 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22460 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61      }.    p->iDa
22470 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a  taVersion--;  /*
22480 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20   Compensate for 
22490 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
224a0 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70  sion++; */.    p
224b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
224c0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
224d0 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
224e0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
224f0 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
22500 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
22510 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22520 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
22530 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22540 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
22550 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
22560 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22570 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
22580 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
22590 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
225a0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
225b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
225c0 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
225d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
225e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
225f0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
22600 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
22610 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
22620 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
22630 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22640 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22650 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
22660 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
22670 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
22680 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
22690 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
226a0 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
226b0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
226c0 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
226d0 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
226e0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
226f0 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
22700 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
22710 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
22720 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
22730 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
22740 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
22750 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
22760 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
22770 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
22780 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
22790 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
227a0 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
227b0 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
227c0 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
227d0 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
227e0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
227f0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
22800 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
22810 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
22820 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
22830 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
22840 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
22850 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
22860 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
22870 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
22880 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
22890 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
228a0 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
228b0 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
228c0 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
228d0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
228e0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
228f0 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
22900 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
22910 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
22920 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
22930 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
22940 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
22950 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
22960 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
22970 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
22980 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
22990 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
229a0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
229b0 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
229c0 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
229d0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
229e0 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
229f0 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
22a00 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
22a10 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
22a20 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
22a30 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
22a40 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
22a50 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
22a60 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
22a70 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
22a80 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
22a90 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
22aa0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
22ab0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
22ac0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
22ad0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
22ae0 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
22af0 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
22b00 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
22b10 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
22b20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
22b30 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
22b40 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
22b50 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
22b60 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
22b70 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
22b80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
22b90 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
22ba0 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
22bb0 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
22bc0 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
22bd0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
22be0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22bf0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
22c00 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
22c10 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
22c20 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
22c30 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e       if( writeOn
22c40 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61  ly && (p->curFla
22c50 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
22c60 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lag)==0 ){.     
22c70 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
22c80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
22c90 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  | p->eState==CUR
22ca0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a  SOR_SKIPNEXT ){.
22cb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
22cc0 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
22cd0 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(p);.          
22ce0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22cf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
22d00 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74   (void)sqlite3Bt
22d10 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
22d20 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29  s(pBtree, rc, 0)
22d30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
22d40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
22d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22d70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
22d80 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
22d90 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
22da0 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
22db0 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78        p->skipNex
22dc0 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20  t = errCode;.   
22dd0 20 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65 65     }.      btree
22de0 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
22df0 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a  Pages(p);.    }.
22e00 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22e10 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
22e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22e30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
22e40 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
22e50 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  n in progress..*
22e60 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65  *.** If tripCode
22e70 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
22e80 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77  K then cursors w
22e90 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
22ea0 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a  ed (tripped)..**
22eb0 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
22ec0 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20  ors are tripped 
22ed0 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
22ee0 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72  true but all cur
22ef0 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70  sors are.** trip
22f00 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
22f10 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20   is false.  Any 
22f20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a  attempt to use.*
22f30 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73  * a tripped curs
22f40 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  or will result i
22f50 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
22f60 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
22f70 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
22f80 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
22f90 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
22fa0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
22fb0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
22fc0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
22fd0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
22fe0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22ff0 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
23000 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c  p, int tripCode,
23010 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
23020 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
23030 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23040 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
23050 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72  pPage1;..  asser
23060 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20  t( writeOnly==1 
23070 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  || writeOnly==0 
23080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69  );.  assert( tri
23090 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42  pCode==SQLITE_AB
230a0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  ORT_ROLLBACK || 
230b0 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
230c0 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
230d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
230e0 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53   if( tripCode==S
230f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23100 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20  rc = tripCode = 
23110 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
23120 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  Bt, 0, 0);.    i
23130 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c  f( rc ) writeOnl
23140 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
23150 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23160 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
23170 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  ipCode ){.    in
23180 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42  t rc2 = sqlite3B
23190 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
231a0 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  rs(p, tripCode, 
231b0 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20  writeOnly);.    
231c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
231d0 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f  TE_OK || (writeO
231e0 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53  nly==0 && rc2==S
231f0 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20  QLITE_OK) );.   
23200 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
23210 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
23220 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67    }.  btreeInteg
23230 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
23240 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23250 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
23260 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
23270 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
23280 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
23290 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
232a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
232b0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
232c0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
232d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
232e0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
232f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
23300 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
23310 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
23320 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
23330 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
23340 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
23350 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
23360 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
23370 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
23380 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
23390 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
233a0 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
233b0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
233c0 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
233d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
233e0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
233f0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
23400 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
23410 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
23420 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
23430 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
23440 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
23450 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
23460 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
23470 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
23480 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
23490 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
234a0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
234b0 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
234c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
234d0 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
234e0 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
234f0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
23500 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
23510 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
23520 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
23530 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
23540 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
23550 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
23560 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
23570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23580 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
23590 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
235a0 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
235b0 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72  saction can be r
235c0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
235d0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
235e0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
235f0 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
23600 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
23610 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
23620 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
23630 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
23640 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
23650 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
23660 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
23670 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
23680 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
23690 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
236a0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
236b0 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
236c0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
236d0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
236e0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
236f0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
23700 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
23710 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
23720 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
23730 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
23740 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
23750 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
23760 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
23770 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
23780 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
23790 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
237a0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
237b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
237c0 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
237d0 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
237e0 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
237f0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
23800 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
23810 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
23820 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
23830 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
23840 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
23850 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
23860 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
23870 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
23880 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
23890 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
238a0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
238b0 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
238c0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
238d0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
238e0 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
238f0 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
23900 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
23910 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
23920 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
23930 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
23940 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
23950 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
23960 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23970 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
23980 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
23990 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
239a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
239b0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
239c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
239d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
239e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
239f0 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
23a00 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
23a10 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
23a20 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23a30 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
23a40 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
23a50 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
23a60 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
23a70 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
23a80 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
23a90 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
23aa0 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
23ab0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
23ac0 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
23ad0 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
23ae0 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
23af0 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
23b00 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
23b10 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
23b20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
23b30 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
23b40 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
23b50 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
23b60 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
23b70 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
23b80 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
23b90 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
23ba0 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
23bb0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
23bc0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
23bd0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
23be0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
23bf0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
23c00 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
23c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
23c20 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
23c30 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
23c40 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
23c50 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23c60 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
23c70 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
23c80 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
23c90 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
23ca0 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
23cb0 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
23cc0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
23cd0 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
23ce0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
23cf0 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
23d00 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
23d10 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
23d20 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
23d30 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
23d40 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
23d50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
23d60 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
23d70 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
23d80 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
23d90 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
23da0 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
23db0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
23dc0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
23dd0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
23de0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
23df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
23e00 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
23e10 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
23e20 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
23e30 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
23e40 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
23e50 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
23e60 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
23e70 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
23e80 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
23e90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
23ea0 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
23eb0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
23ec0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
23ed0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
23ee0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
23ef0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
23f00 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
23f10 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
23f20 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
23f30 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
23f40 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
23f50 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23f60 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
23f70 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
23f80 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
23f90 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
23fa0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
23fb0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
23fc0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
23fd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
23ff0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
24000 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
24010 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
24020 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
24030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24040 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
24050 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28  Savepoint<0 && (
24060 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
24070 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
24080 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  PTY)!=0 ){.     
24090 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
240a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
240b0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
240c0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
240d0 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
240e0 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
240f0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
24100 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
24110 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
24120 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
24130 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
24140 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
24150 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
24160 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
24170 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
24180 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
24190 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
241a0 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
241b0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
241c0 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
241d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
241e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
241f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24200 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
24210 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
24220 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
24230 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
24240 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
24250 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
24260 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
24270 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
24280 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
24290 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
242a0 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
242b0 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
242c0 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
242d0 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
242e0 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
242f0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
24300 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
24310 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
24320 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
24330 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
24340 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52  **.** If the BTR
24350 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20  EE_WRCSR bit of 
24360 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  wrFlag is clear,
24370 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
24380 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20   can only.** be 
24390 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
243a0 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  .  If the BTREE_
243b0 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65 74  WRCSR bit is set
243c0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
243d0 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  r.** can be used
243e0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
243f0 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f  for writing if o
24400 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
24410 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61  for writing.** a
24420 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
24430 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64  ese are the cond
24440 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
24450 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
24460 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20  .** for writing 
24470 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  to be allowed:.*
24480 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
24490 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
244a0 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
244b0 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67  rFlag containing
244c0 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a   BTREE_WRCSR.**.
244d0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
244e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
244f0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
24500 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
24510 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
24520 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
24530 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
24540 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
24550 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
24560 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
24570 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
24580 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
24590 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
245a0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
245b0 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
245c0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
245d0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
245e0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
245f0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
24600 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
24610 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
24620 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
24630 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
24640 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
24650 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
24660 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
24670 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
24680 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45  ..**.** The BTRE
24690 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20  E_FORDELETE bit 
246a0 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70  of wrFlag may op
246b0 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20  tionally be set 
246c0 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  if BTREE_WRCSR.*
246d0 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f  * is set.  If FO
246e0 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20  RDELETE is set, 
246f0 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74  that is a hint t
24700 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  o the implementa
24710 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69  tion that.** thi
24720 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e  s cursor will on
24730 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 65  ly be used to se
24740 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65  ek to and delete
24750 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69   entries of an i
24760 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20  ndex.** as part 
24770 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45  of a larger DELE
24780 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  TE statement.  T
24790 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e  he FORDELETE hin
247a0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
247b0 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65  .** this impleme
247c0 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e  ntation.  But in
247d0 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20   a hypothetical 
247e0 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72  alternative stor
247f0 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69  age engine .** i
24800 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e  n which index en
24810 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61  tries are automa
24820 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
24830 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69  when correspondi
24840 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73  ng table.** rows
24850 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68   are deleted, th
24860 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67  e FORDELETE flag
24870 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74 20   is a hint that 
24880 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c  all SEEK and DEL
24890 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ETE.** operation
248a0 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72  s on this cursor
248b0 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61   can be no-ops a
248c0 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72  nd all READ oper
248d0 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72  ations can .** r
248e0 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77  eturn a null row
248f0 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20   (2-bytes: 0x01 
24900 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  0x00)..**.** No 
24910 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
24920 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
24930 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
24940 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
24950 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
24960 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
24970 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
24980 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
24990 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
249a0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
249b0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
249c0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
249d0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
249e0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
249f0 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
24a00 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
24a10 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
24a20 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
24a30 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
24a40 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
24a50 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
24a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a80 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
24a90 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ab0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
24ac0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
24ad0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
24ae0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
24b10 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
24b20 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
24b30 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
24b40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
24b50 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
24b60 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
24b70 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
24ba0 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
24bb0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
24bc0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24be0 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
24bf0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43   handle */.  BtC
24c00 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20  ursor *pX;      
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f      /* Looping o
24c30 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75  ver other all cu
24c40 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  rsors */..  asse
24c50 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
24c60 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
24c70 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
24c80 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  g==0 .       || 
24c90 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52  wrFlag==BTREE_WR
24ca0 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  CSR .       || w
24cb0 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52  rFlag==(BTREE_WR
24cc0 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c  CSR|BTREE_FORDEL
24cd0 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ETE) .  );..  /*
24ce0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
24cf0 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
24d00 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
24d10 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62  this is a sharab
24d20 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20  le .  ** b-tree 
24d30 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f  database, the co
24d40 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
24d50 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64  ing the required
24d60 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20   table locks, . 
24d70 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20   ** and that no 
24d80 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
24d90 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75   has any open cu
24da0 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69  rsor that confli
24db0 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74  cts with .  ** t
24dc0 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  his lock.  */.  
24dd0 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
24de0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
24df0 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49  p, iTable, pKeyI
24e00 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f  nfo!=0, (wrFlag?
24e10 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72  2:1)) );.  asser
24e20 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
24e30 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
24e40 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
24e50 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
24e60 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
24e70 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
24e80 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
24e90 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
24ea0 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
24eb0 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
24ec0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
24ed0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
24ee0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
24ef0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
24f00 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
24f10 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
24f20 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
24f30 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
24f40 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
24f50 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46  =0 );..  if( wrF
24f60 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  lag ){.    alloc
24f70 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
24f80 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
24f90 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72  pTmpSpace==0 ) r
24fa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
24fb0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EM_BKPT;.  }.  i
24fc0 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
24fd0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
24fe0 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Bt)==0 ){.    as
24ff0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
25000 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20  );.    iTable = 
25010 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  0;.  }..  /* Now
25020 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
25030 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
25040 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
25050 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
25060 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
25070 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
25080 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
25090 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
250a0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
250b0 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
250c0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
250d0 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
250e0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
250f0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
25100 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
25110 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
25120 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
25130 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c  g ? BTCF_WriteFl
25140 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ag : 0;.  pCur->
25150 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20  curPagerFlags = 
25160 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47  wrFlag ? 0 : PAG
25170 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b  ER_GET_READONLY;
25180 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
25190 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  re two or more c
251a0 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61  ursors on the sa
251b0 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61  me btree, then a
251c0 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72  ll such.  ** cur
251d0 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65  sors *must* have
251e0 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
251f0 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a  le flag set. */.
25200 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43    for(pX=pBt->pC
25210 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58  ursor; pX; pX=pX
25220 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
25230 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  ( pX->pgnoRoot==
25240 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a  (Pgno)iTable ){.
25250 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61        pX->curFla
25260 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
25270 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ple;.      pCur-
25280 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
25290 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
252a0 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e  }.  }.  pCur->pN
252b0 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
252c0 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73  or;.  pBt->pCurs
252d0 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
252e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
252f0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
25300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25310 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
25320 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
25330 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
25360 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
25370 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
253a0 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
253b0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
253c0 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
253f0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
25400 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
25410 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
25440 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
25450 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25480 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
25490 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
254a0 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62  t rc;.  if( iTab
254b0 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  le<1 ){.    rc =
254c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
254d0 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
254e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
254f0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
25500 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
25510 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
25520 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
25530 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
25540 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
25550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25560 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25570 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
25580 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
25590 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
255a0 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
255b0 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
255c0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
255d0 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
255e0 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
255f0 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
25600 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
25610 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
25620 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
25630 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
25640 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
25650 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
25660 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
25670 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
25680 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25690 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
256a0 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
256b0 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
256c0 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
256d0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
256e0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
256f0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
25700 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
25710 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
25720 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
25730 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
25740 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
25750 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
25760 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
25770 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
25780 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
25790 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
257a0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
257b0 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
257c0 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
257d0 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
257e0 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
257f0 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
25800 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
25810 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
25820 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
25830 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
25840 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
25850 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
25860 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 42 54 43  of(BtCursor, BTC
25870 55 52 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e  URSOR_FIRST_UNIN
25880 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  IT));.}../*.** C
25890 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
258a0 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
258b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
258c0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
258d0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
258e0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
258f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25900 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
25910 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25920 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
25930 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
25940 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
25950 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
25960 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
25970 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
25980 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
25990 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
259a0 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
259b0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
259c0 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
259d0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
259e0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
259f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25a00 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
25a10 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
25a20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
25a30 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
25a40 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
25a50 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
25a60 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
25a70 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
25a80 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
25a90 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
25aa0 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
25ab0 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
25ac0 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
25ad0 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
25ae0 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
25af0 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  Cur);.    unlock
25b00 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
25b10 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
25b20 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
25b30 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  flow);.    sqlit
25b40 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
25b50 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ey);.    sqlite3
25b60 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
25b70 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 42  e);.    pCur->pB
25b80 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tree = 0;.  }.  
25b90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
25bb0 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
25bc0 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
25bd0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
25be0 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
25bf0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
25c00 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
25c10 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
25c20 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
25c30 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
25c40 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
25c50 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
25c60 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
25c70 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
25c80 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
25c90 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
25ca0 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
25cb0 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
25cc0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
25cd0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
25ce0 42 55 47 0a 20 20 73 74 61 74 69 63 20 69 6e 74  BUG.  static int
25cf0 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43   cellInfoEqual(C
25d00 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c  ellInfo *a, Cell
25d10 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66  Info *b){.    if
25d20 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b  ( a->nKey!=b->nK
25d30 65 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ey ) return 0;. 
25d40 20 20 20 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f     if( a->pPaylo
25d50 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20  ad!=b->pPayload 
25d60 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25d70 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21  if( a->nPayload!
25d80 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72  =b->nPayload ) r
25d90 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
25da0 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e   a->nLocal!=b->n
25db0 4c 6f 63 61 6c 20 29 20 72 65 74 75 72 6e 20 30  Local ) return 0
25dc0 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 53 69  ;.    if( a->nSi
25dd0 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72  ze!=b->nSize ) r
25de0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
25df0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61  urn 1;.  }.  sta
25e00 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
25e10 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
25e20 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
25e30 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
25e40 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
25e50 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
25e60 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
25e70 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
25e80 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29  pCur->ix, &info)
25e90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  ;.    assert( CO
25ea0 52 52 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c  RRUPT_DB || cell
25eb0 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c  InfoEqual(&info,
25ec0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b   &pCur->info) );
25ed0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
25ee0 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
25ef0 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74  nfo(x).#endif.st
25f00 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
25f10 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c  LINE void getCel
25f20 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
25f30 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75  pCur){.  if( pCu
25f40 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
25f50 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   ){.    pCur->cu
25f60 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
25f70 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74  alidNKey;.    bt
25f80 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
25f90 72 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e 69  r->pPage,pCur->i
25fa0 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  x,&pCur->info);.
25fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
25fc0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
25fd0 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
25fe0 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
25ff0 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
26000 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
26010 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
26020 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
26030 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
26040 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
26050 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
26060 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
26070 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
26080 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
26090 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
260a0 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
260b0 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
260c0 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
260d0 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
260e0 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
260f0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
26100 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
26110 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
26120 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
26130 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
26140 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26150 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
26160 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e   /* NDEBUG */.in
26170 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
26180 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74  rsorIsValidNN(Bt
26190 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
261a0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
261b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75   );.  return pCu
261c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
261d0 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  R_VALID;.}../*.*
261e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
261f0 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
26200 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22  r key or "rowid"
26210 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72   for a table btr
26220 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ee..** This rout
26230 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ine is only vali
26240 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
26250 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  hat is pointing 
26260 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61  into a.** ordina
26270 72 79 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20  ry table btree. 
26280 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 70   If the cursor p
26290 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65  oints to an inde
262a0 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73  x btree or.** is
262b0 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65   invalid, the re
262c0 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75  sult of this rou
262d0 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65  tine is undefine
262e0 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  d..*/.i64 sqlite
262f0 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79  3BtreeIntegerKey
26300 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26310 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
26320 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26330 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
26340 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26350 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26360 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
26370 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74  rIntKey );.  get
26380 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
26390 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69    return pCur->i
263a0 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66  nfo.nKey;.}..#if
263b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
263c0 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e  E_OFFSET_SQL_FUN
263d0 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  C./*.** Return t
263e0 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74  he offset into t
263f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26400 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
26410 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64  f the.** payload
26420 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
26430 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
26440 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
26450 42 74 72 65 65 4f 66 66 73 65 74 28 42 74 43 75  BtreeOffset(BtCu
26460 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
26470 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
26480 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26490 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
264a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
264b0 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65  VALID );.  getCe
264c0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
264d0 72 65 74 75 72 6e 20 28 69 36 34 29 70 43 75 72  return (i64)pCur
264e0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  ->pBt->pageSize*
264f0 28 28 69 36 34 29 70 43 75 72 2d 3e 70 50 61 67  ((i64)pCur->pPag
26500 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20  e->pgno - 1) +. 
26510 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70 43          (i64)(pC
26520 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
26530 64 20 2d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  d - pCur->pPage-
26540 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69  >aData);.}.#endi
26550 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
26560 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55  LE_OFFSET_SQL_FU
26570 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  NC */../*.** Ret
26580 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
26590 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  f bytes of paylo
265a0 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ad for the entry
265b0 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
265c0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
265d0 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62  ing to.  For tab
265e0 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69 73 20  le btrees, this 
265f0 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75  will be the amou
26600 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20  nt.** of data.  
26610 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65 73  For index btrees
26620 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  , this will be t
26630 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b  he size of the k
26640 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
26650 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
26660 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
26670 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
26680 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
26690 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
266a0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
266b0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
266c0 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
266d0 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
266e0 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
266f0 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
26700 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73  _VALID..*/.u32 s
26710 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
26720 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  adSize(BtCursor 
26730 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
26740 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
26750 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
26760 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
26770 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
26780 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
26790 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  o(pCur);.  retur
267a0 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  n pCur->info.nPa
267b0 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  yload;.}../*.** 
267c0 52 65 74 75 72 6e 20 61 6e 20 75 70 70 65 72 20  Return an upper 
267d0 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 69 7a  bound on the siz
267e0 65 20 6f 66 20 61 6e 79 20 72 65 63 6f 72 64 20  e of any record 
267f0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  for the table.**
26800 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
26810 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
26820 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  o..**.** This is
26830 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
26840 2e 20 20 45 76 65 72 79 74 68 69 6e 67 20 77 69  .  Everything wi
26850 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ll still work if
26860 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
26870 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
26880 32 31 34 37 34 38 33 36 34 37 20 28 77 68 69 63  2147483647 (whic
26890 68 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  h is the largest
268a0 20 72 65 63 6f 72 64 0a 2a 2a 20 74 68 61 74 20   record.** that 
268b0 53 51 4c 69 74 65 20 63 61 6e 20 68 61 6e 64 6c  SQLite can handl
268c0 65 29 20 6f 72 20 6d 6f 72 65 2e 20 20 42 75 74  e) or more.  But
268d0 20 72 65 74 75 72 6e 69 6e 67 20 61 20 73 6d 61   returning a sma
268e0 6c 6c 65 72 20 76 61 6c 75 65 20 6d 69 67 68 74  ller value might
268f0 0a 2a 2a 20 70 72 65 76 65 6e 74 20 6c 61 72 67  .** prevent larg
26900 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
26910 69 6f 6e 73 20 77 68 65 6e 20 74 72 79 69 6e 67  ions when trying
26920 20 74 6f 20 69 6e 74 65 72 70 72 65 74 20 61 0a   to interpret a.
26930 2a 2a 20 63 6f 72 72 75 70 74 20 64 61 74 72 61  ** corrupt datra
26940 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
26950 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
26960 74 61 74 69 6f 6e 20 6d 65 72 65 6c 79 20 72 65  tation merely re
26970 74 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  turns the size o
26980 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
26990 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
269a0 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  e..*/.sqlite3_in
269b0 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  t64 sqlite3Btree
269c0 4d 61 78 52 65 63 6f 72 64 53 69 7a 65 28 42 74  MaxRecordSize(Bt
269d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
269e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
269f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26a10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26a20 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 65 74  R_VALID );.  ret
26a30 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 2d 3e 70  urn pCur->pBt->p
26a40 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
26a50 65 33 5f 69 6e 74 36 34 29 70 43 75 72 2d 3e 70  e3_int64)pCur->p
26a60 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a  Bt->nPage;.}../*
26a70 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
26a80 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
26a90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
26aa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
26ab0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
26ac0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
26ad0 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
26ae0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
26af0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
26b00 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
26b10 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
26b20 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
26b30 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
26b40 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
26b50 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
26b60 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
26b70 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
26b80 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
26b90 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
26ba0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
26bb0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
26bc0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
26bd0 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
26be0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
26bf0 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
26c00 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
26c10 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
26c20 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
26c30 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
26c40 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
26c50 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
26c60 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
26c70 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
26c80 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
26c90 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
26ca0 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
26cb0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
26cc0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
26cd0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
26ce0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
26cf0 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
26d00 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
26d10 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
26d20 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
26d30 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
26d40 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
26d50 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
26d60 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
26d70 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
26d80 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
26d90 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
26da0 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
26db0 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
26dc0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
26dd0 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
26de0 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
26df0 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
26e00 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
26e10 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
26e20 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
26e30 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
26e40 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
26e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26e60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26e70 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
26ea0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
26eb0 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
26ec0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
26ed0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
26ee0 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
26ef0 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
26f00 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
26f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26f20 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
26f30 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
26f40 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
26f50 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
26f60 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
26f70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26f80 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
26f90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
26fa0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
26fb0 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
26fc0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
26fd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26fe0 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
26ff0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
27000 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
27010 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
27020 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
27030 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
27040 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
27050 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
27060 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
27070 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
27080 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
27090 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
270a0 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
270b0 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
270c0 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
270d0 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
270e0 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
270f0 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
27100 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
27110 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
27120 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
27130 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
27140 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
27150 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
27160 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
27170 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
27180 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
27190 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
271a0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
271b0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
271c0 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
271d0 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
271e0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
271f0 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
27200 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
27210 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
27220 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
27230 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27240 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
27250 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
27260 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
27270 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
27280 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
27290 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
272a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
272b0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
272c0 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
272d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
272e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
272f0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
27300 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
27310 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
27320 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
27330 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
27340 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
27350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27360 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
27370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
27390 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
273a0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
273b0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
273c0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
273d0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
273e0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
273f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
27400 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
27410 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27420 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
27430 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
27440 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
27450 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
27460 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
27470 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
27480 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
27490 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
274a0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
274b0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
274c0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
274d0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
274e0 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
274f0 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
27500 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
27510 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
27520 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
27530 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
27540 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
27550 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
27560 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
27570 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
27580 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
27590 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
275a0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
275b0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
275c0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
275d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
275e0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
275f0 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
27600 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
27610 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
27620 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
27630 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
27640 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
27650 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
27660 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27680 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
27690 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
276a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
276b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
276c0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
276d0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
276e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
276f0 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
27700 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
27710 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
27720 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
27730 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
27740 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
27750 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
27760 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
27770 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
27780 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
27790 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
277a0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
277b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
277c0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
277d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
277e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
277f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
27800 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
27810 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
27820 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
27830 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
27840 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
27850 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
27860 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
27870 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
27880 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
27890 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
278a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
278b0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
278c0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
278d0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
278e0 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
278f0 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
27900 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
27910 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
27920 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
27930 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
27940 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
27950 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
27960 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
27970 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
27980 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
27990 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
279a0 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
279b0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
279c0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
279d0 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
279e0 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
279f0 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
27a00 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
27a10 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
27a20 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
27a30 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
27a40 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
27a50 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
27a60 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
27a70 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
27a80 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
27a90 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
27aa0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
27ab0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
27ac0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
27ad0 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
27ae0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
27af0 70 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75  pages.** this fu
27b00 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63  nction may alloc
27b10 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ate space for an
27b20 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  d lazily populat
27b30 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f  e.** the overflo
27b40 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
27b50 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
27b60 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
27b70 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
27b80 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
27b90 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
27ba0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
27bb0 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
27bc0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
27bd0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
27be0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
27bf0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
27c00 6f 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20  ocated, it must 
27c10 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
27c20 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
27c30 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
27c40 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
27c50 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
27c60 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
27c70 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
27c80 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
27c90 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
27ca0 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
27cb0 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
27cc0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
27cd0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
27ce0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
27cf0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
27d00 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
27d10 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
27d20 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
27d30 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
27d40 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
27d50 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
27d60 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
27d70 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
27d80 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
27d90 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
27da0 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
27db0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
27dc0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
27dd0 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
27de0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
27df0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
27e00 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
27e10 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27e30 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
27e40 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
27e50 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
27e60 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
27e70 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
27e80 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27ea0 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
27eb0 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
27ec0 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
27ed0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
27ee0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
27ef0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
27f00 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
27f10 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
27f20 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->pPage;        
27f30 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
27f40 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
27f50 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
27f60 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
27f70 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
27f80 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
27f90 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
27fa0 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
27fb0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
27fc0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
27fd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
27fe0 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
27ff0 20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74   pBuf;     /* St
28000 61 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  art of original 
28010 6f 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65  out buffer */.#e
28020 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
28030 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
28040 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70  t( eOp==0 || eOp
28050 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
28060 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28070 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
28080 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28090 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
280a0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
280b0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
280c0 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
280d0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
280e0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
280f0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.pPayload;.  
28100 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
28110 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
28120 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
28130 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64  assert( aPayload
28140 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   > pPage->aData 
28150 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28  );.  if( (uptr)(
28160 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65  aPayload - pPage
28170 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d  ->aData) > (pBt-
28180 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43  >usableSize - pC
28190 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29  ur->info.nLocal)
281a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
281b0 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
281c0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
281d0 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
281e0 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20  n error.  The.  
281f0 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c    ** conditional
28200 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79   above is really
28210 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61  :.    **    &aPa
28220 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
28230 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
28240 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
28250 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a  ableSize].    **
28260 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69   but is recast i
28270 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20  nto its current 
28280 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e  form to avoid in
28290 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70  teger overflow p
282a0 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20  roblems.    */. 
282b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
282c0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
282d0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
282e0 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
282f0 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
28300 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
28310 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
28320 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
28330 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
28340 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
28350 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
28360 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
28370 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
28380 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
28390 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
283a0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
283b0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
283c0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
283d0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
283e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
283f0 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
28400 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
28410 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
28420 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
28430 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
28440 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20  nLocal;.  }...  
28450 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28460 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
28470 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
28480 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
28490 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
284a0 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
284b0 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
284c0 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
284d0 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
284e0 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
284f0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
28500 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f  nLocal]);..    /
28510 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
28520 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61  r.aOverflow[] ha
28530 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
28540 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
28550 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  t now..    **.  
28560 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
28570 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
28580 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
28590 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
285a0 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
285b0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
285c0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
285d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
285e0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
285f0 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
28600 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
28610 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
28620 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
28630 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
28640 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
28650 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
28660 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
28670 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
28680 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72  */.    if( (pCur
28690 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
286a0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
286b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
286c0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
286d0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
286e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
286f0 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
28700 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
28710 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20  ->aOverflow==0. 
28720 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28        || nOvfl*(
28730 69 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f 29  int)sizeof(Pgno)
28740 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   > sqlite3Malloc
28750 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  Size(pCur->aOver
28760 66 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a 20  flow).      ){. 
28770 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65         Pgno *aNe
28780 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74  w = (Pgno*)sqlit
28790 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
287a0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
287b0 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
287c0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
287d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
287e0 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
287f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28800 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
28810 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
28820 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
28830 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e  ->aOverflow = aN
28840 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
28850 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
28860 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
28870 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
28880 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
28890 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
288a0 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76   |= BTCF_ValidOv
288b0 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  fl;.    }else{. 
288c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
288d0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
288e0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
288f0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
28900 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72  he.      ** entr
28910 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
28920 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
28930 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
28940 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64   skip.      ** d
28950 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
28960 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
28970 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
28980 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
28990 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49  e] ){.        iI
289a0 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
289b0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  lSize);.        
289c0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
289d0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
289e0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
289f0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
28a00 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
28a10 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
28a20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28a30 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77  & amt>0 );.    w
28a40 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29  hile( nextPage )
28a50 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  {.      /* If re
28a60 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
28a70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
28a80 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
28a90 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
28aa0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
28ab0 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20  iIdx]==0.       
28ac0 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e         || pCur->
28ad0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
28ae0 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20  =nextPage.      
28af0 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55          || CORRU
28b00 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70  PT_DB );.      p
28b10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28b20 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
28b30 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
28b40 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
28b50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
28b60 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
28b70 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
28b80 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
28b90 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
28ba0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
28bb0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
28bc0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
28bd0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
28be0 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
28bf0 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
28c00 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
28c10 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
28c20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
28c30 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
28c40 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
28c50 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
28c60 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
28c70 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
28c80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28c90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
28ca0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
28cb0 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20  lidOvfl );.     
28cc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28cd0 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74  >pBtree->db==pBt
28ce0 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20  ->db );.        
28cf0 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
28d00 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
28d10 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
28d20 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
28d30 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
28d40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28d50 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
28d60 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
28d70 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
28d80 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
28d90 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65   }.        offse
28da0 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
28db0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28dc0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
28dd0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
28de0 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
28df0 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
28e00 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
28e10 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
28e20 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
28e30 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
28e40 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
28e50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
28e60 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
28e70 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
28e80 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
28e90 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
28ea0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
28eb0 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
28ec0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
28ed0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
28ee0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
28ef0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
28f00 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
28f10 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
28f20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
28f30 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
28f40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
28f50 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
28f60 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
28f70 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
28f80 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
28f90 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
28fa0 72 65 20 61 72 65 20 6e 6f 20 64 69 72 74 79 20  re are no dirty 
28fb0 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
28fc0 65 2d 63 61 63 68 65 0a 20 20 20 20 20 20 20 20  e-cache.        
28fd0 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74 61  **   4) the data
28fe0 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
28ff0 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
29000 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61 67   **   5) the pag
29010 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
29020 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  WAL file.       
29030 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73   **   6) at leas
29040 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
29050 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
29060 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
29070 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
29080 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
29090 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
290a0 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
290b0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
290c0 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
290d0 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
290e0 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
290f0 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
29100 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
29110 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
29120 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
29130 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
29140 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
29150 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
29160 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
29170 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20  f( eOp==0       
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
291b0 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
291c0 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
291f0 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
29200 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
29210 72 44 69 72 65 63 74 52 65 61 64 4f 6b 28 70 42  rDirectReadOk(pB
29220 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
29230 61 67 65 29 20 20 20 20 2f 2a 20 28 33 2c 34 2c  age)    /* (3,4,
29240 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  5) */.         &
29250 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75  & &pBuf[-4]>=pBu
29260 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20  fStart          
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
29290 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
292a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
292b0 20 2a 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   *fd = sqlite3Pa
292c0 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
292d0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
292e0 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
292f0 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
29300 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
29310 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29320 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
29330 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
29340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29350 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20   due to (6) */. 
29360 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29370 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34  aSave, aWrite, 4
29380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
29390 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
293a0 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c  fd, aWrite, a+4,
293b0 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53   (i64)pBt->pageS
293c0 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29  ize*(nextPage-1)
293d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
293e0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
293f0 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  (aWrite);.      
29400 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74      memcpy(aWrit
29410 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20  e, aSave, 4);.  
29420 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
29430 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  if..        {.  
29440 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
29450 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
29460 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29470 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
29480 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
29490 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
294a0 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f         (eOp==0 ?
294b0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
294c0 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
294d0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
294e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
294f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
29500 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
29510 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
29520 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
29530 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
29540 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
29550 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
29560 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
29570 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
29580 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
29590 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
295a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
295b0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
295c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
295d0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
295e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
295f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
29600 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 69   -= a;.        i
29610 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74 75  f( amt==0 ) retu
29620 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70  rn rc;.        p
29630 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
29640 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
29650 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 49   break;.      iI
29660 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dx++;.    }.  }.
29670 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29680 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
29690 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  .    /* Overflow
296a0 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65 6d   chain ends prem
296b0 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20 72  aturely */.    r
296c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
296d0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
296e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
296f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
29700 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 79   part of the pay
29710 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77  load for the row
29720 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63   at which that c
29730 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63 75  ursor pCur is cu
29740 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
29750 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65  ing.  "amt" byte
29760 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
29770 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
29780 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
29790 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
297a0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43  ffset"..**.** pC
297b0 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69  ur can be pointi
297c0 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20 74  ng to either a t
297d0 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78  able or an index
297e0 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70   b-tree..** If p
297f0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62  ointing to a tab
29800 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74  le btree, then t
29810 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69  he content secti
29820 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a  on is read.  If.
29830 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
29840 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ing to an index 
29850 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65 20  b-tree then the 
29860 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72  key section is r
29870 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  ead..**.** For s
29880 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
29890 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72  ad(), the caller
298a0 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
298b0 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
298c0 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
298d0 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c   row in the tabl
298e0 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42  e.  For sqlite3B
298f0 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
29900 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72  ed(), the.** cur
29910 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76  sor might be inv
29920 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65  alid or might ne
29930 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ed to be restore
29940 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
29950 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ead..**.** Retur
29960 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
29970 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
29980 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
29990 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
299a0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
299b0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
299c0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
299d0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
299e0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
299f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29a00 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43  BtreePayload(BtC
29a10 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
29a20 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
29a30 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
29a40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
29a50 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
29a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29a70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29a80 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
29a90 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29aa0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  >=0 && pCur->pPa
29ab0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
29ac0 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
29ad0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
29ae0 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
29af0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
29b00 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
29b10 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
29b20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
29b30 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69   variant of sqli
29b40 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
29b50 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20  ) works even if 
29b60 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
29b70 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52  ot.** in the CUR
29b80 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e  SOR_VALID state.
29b90 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65    It is only use
29ba0 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
29bb0 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20  _blob_read().** 
29bc0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
29bd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29be0 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69  T_INCRBLOB.stati
29bf0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
29c00 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  E int accessPayl
29c10 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74  oadChecked(.  Bt
29c20 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20  Cursor *pCur,.  
29c30 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33  u32 offset,.  u3
29c40 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70  2 amt,.  void *p
29c50 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Buf.){.  int rc;
29c60 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
29c70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
29c80 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
29c90 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
29ca0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
29cb0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
29cc0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
29cd0 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
29ce0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
29cf0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  r);.  return rc 
29d00 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61 79  ? rc : accessPay
29d10 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
29d20 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
29d30 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
29d40 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
29d50 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
29d60 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
29d70 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
29d80 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  uf){.  if( pCur-
29d90 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29da0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
29db0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
29dc0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
29dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
29de0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
29df0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
29e00 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f, 0);.  }else{.
29e10 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73      return acces
29e20 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
29e30 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
29e40 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a  t, pBuf);.  }.}.
29e50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
29e60 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
29e70 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
29e80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
29e90 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
29ea0 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
29eb0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
29ec0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
29ed0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
29ee0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
29ef0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
29f00 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
29f10 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
29f20 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
29f30 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
29f40 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
29f50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
29f60 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
29f70 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
29f80 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
29f90 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
29fa0 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
29fb0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
29fc0 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
29fd0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
29fe0 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
29ff0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a000 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2a010 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
2a020 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
2a030 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
2a040 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
2a050 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
2a060 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
2a070 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
2a080 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
2a090 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
2a0a0 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
2a0b0 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
2a0c0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
2a0d0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
2a0e0 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
2a0f0 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
2a100 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
2a110 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
2a120 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2a130 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
2a140 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
2a150 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
2a160 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
2a170 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
2a180 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
2a190 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
2a1a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
2a1b0 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
2a1c0 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
2a1d0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
2a1e0 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
2a1f0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
2a200 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
2a210 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
2a220 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2a230 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
2a240 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
2a250 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
2a260 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
2a270 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
2a280 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
2a290 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
2a2a0 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
2a2b0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
2a2c0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
2a2d0 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
2a2e0 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20  ){.  int amt;.  
2a2f0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
2a300 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
2a310 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
2a320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a330 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2a340 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2a350 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2a360 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2a370 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2a380 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
2a390 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2a3a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a3b0 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
2a3c0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
2a3d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a3e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
2a3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a400 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2a410 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  >pCur->pPage->aD
2a420 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ata || CORRUPT_D
2a430 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
2a440 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
2a450 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ad<pCur->pPage->
2a460 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55  aDataEnd ||CORRU
2a470 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20  PT_DB);.  amt = 
2a480 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
2a490 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69 6e  l;.  if( amt>(in
2a4a0 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t)(pCur->pPage->
2a4b0 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
2a4c0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 20  >info.pPayload) 
2a4d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
2a4e0 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73 70  is too little sp
2a4f0 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
2a500 66 6f 72 20 74 68 65 20 65 78 70 65 63 74 65 64  for the expected
2a510 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20 6f   amount.    ** o
2a520 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74 2e  f local content.
2a530 20 44 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   Database must b
2a540 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
2a550 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
2a560 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74 20  T_DB );.    amt 
2a570 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28 70  = MAX(0, (int)(p
2a580 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
2a590 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
2a5a0 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20 20  o.pPayload));.  
2a5b0 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33 32  }.  *pAmt = (u32
2a5c0 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  )amt;.  return (
2a5d0 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
2a5e0 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
2a5f0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
2a600 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
2a610 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
2a620 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
2a630 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
2a640 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
2a650 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
2a660 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
2a670 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
2a680 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
2a690 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
2a6a0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
2a6b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
2a6c0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
2a6d0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
2a6e0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
2a6f0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
2a700 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
2a710 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
2a720 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
2a730 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
2a740 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
2a750 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
2a760 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
2a770 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
2a780 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
2a790 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
2a7a0 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
2a7b0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
2a7c0 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
2a7d0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
2a7e0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
2a7f0 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
2a800 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
2a810 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
2a820 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
2a830 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
2a840 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
2a850 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  dFetch(BtCursor 
2a860 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
2a870 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
2a880 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
2a890 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
2a8a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a8b0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
2a8c0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
2a8d0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
2a8e0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
2a8f0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
2a900 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
2a910 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
2a920 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2a930 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
2a940 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
2a950 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
2a960 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
2a970 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
2a980 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
2a990 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
2a9a0 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
2a9b0 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
2a9c0 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
2a9d0 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
2a9e0 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
2a9f0 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
2aa00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2aa10 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
2aa20 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
2aa30 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
2aa40 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
2aa50 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
2aa60 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2aa70 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2aa80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2aa90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2aaa0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2aab0 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
2aac0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
2aad0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2aae0 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
2aaf0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
2ab00 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
2ab10 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
2ab20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2ab30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
2ab40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2ab50 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2ab60 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2ab70 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2ab80 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43  ValidOvfl);.  pC
2ab90 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2aba0 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 69  iPage] = pCur->i
2abb0 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  x;.  pCur->apPag
2abc0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  e[pCur->iPage] =
2abd0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2abe0 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
2abf0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20  pCur->iPage++;. 
2ac00 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e   return getAndIn
2ac10 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
2ac20 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  gno, &pCur->pPag
2ac30 65 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63  e, pCur, pCur->c
2ac40 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d  urPagerFlags);.}
2ac50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2ac60 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
2ac70 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
2ac80 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
2ac90 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
2aca0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
2acb0 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
2acc0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
2acd0 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
2ace0 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
2acf0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
2ad00 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
2ad10 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
2ad20 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
2ad30 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
2ad40 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
2ad50 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
2ad60 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
2ad70 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
2ad80 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
2ad90 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
2ada0 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
2adb0 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
2adc0 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
2add0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
2ade0 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
2adf0 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
2ae00 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
2ae10 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
2ae40 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
2ae50 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
2ae60 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
2ae70 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
2ae80 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
2ae90 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
2aea0 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
2aeb0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2aec0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2aed0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
2aee0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2aef0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
2af00 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
2af10 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
2af20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
2af30 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
2af40 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
2af50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
2af60 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
2af70 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2af80 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
2af90 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
2afa0 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
2afb0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
2afc0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
2afd0 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
2afe0 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
2aff0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
2b000 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
2b010 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
2b020 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
2b030 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
2b040 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
2b050 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
2b060 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
2b070 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
2b080 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2b090 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b 0a 20  emPage *pLeaf;. 
2b0a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2b0b0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2b0c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b0d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b0e0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2b0f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2b100 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
2b110 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  ( pCur->pPage );
2b120 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
2b130 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
2b140 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b150 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
2b160 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b170 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
2b180 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  r->pPage->pgno. 
2b190 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b1a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2b1b0 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
2b1c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b1d0 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
2b1e0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2b1f0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2b200 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2b210 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2b220 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2b230 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 43  .  pCur->ix = pC
2b240 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2b250 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c 65 61  iPage-1];.  pLea
2b260 66 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  f = pCur->pPage;
2b270 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
2b280 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 2d 2d   pCur->apPage[--
2b290 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2b2a0 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2b2b0 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a  ll(pLeaf);.}../*
2b2c0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2b2d0 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
2b2e0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2b2f0 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
2b300 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
2b310 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
2b320 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2b330 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
2b340 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
2b350 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
2b360 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2b370 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
2b380 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
2b390 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
2b3a0 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
2b3b0 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
2b3c0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
2b3d0 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
2b3e0 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
2b3f0 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
2b400 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
2b410 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
2b420 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
2b430 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
2b440 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
2b450 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
2b460 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
2b470 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
2b480 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20 74 68  R_INVALID and th
2b490 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2b4a0 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e  ns SQLITE_EMPTY.
2b4b0 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
2b4c0 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
2b4d0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2b4e0 20 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f 63 61   first cell loca
2b4f0 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 0a  ted on the root.
2b500 2a 2a 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ** (or virtual r
2b510 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
2b520 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
2b530 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
2b540 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
2b550 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2b560 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
2b570 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
2b580 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
2b590 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
2b5a0 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
2b5b0 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
2b5c0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
2b5d0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
2b5e0 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
2b5f0 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
2b600 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
2b610 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
2b620 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
2b630 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
2b640 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
2b650 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
2b660 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
2b670 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
2b680 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
2b690 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
2b6a0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
2b6b0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
2b6c0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
2b6d0 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
2b6e0 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
2b6f0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
2b700 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
2b710 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
2b720 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2b730 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
2b740 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b750 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2b760 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2b770 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2b780 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
2b790 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
2b7a0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
2b7b0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2b7c0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
2b7d0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2b7e0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
2b7f0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
2b800 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2b810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b820 2d 3e 65 53 74 61 74 65 20 3c 20 43 55 52 53 4f  ->eState < CURSO
2b830 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 7c 7c  R_REQUIRESEEK ||
2b840 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29   pCur->iPage<0 )
2b850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b860 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20  ->pgnoRoot>0 || 
2b870 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b  pCur->iPage<0 );
2b880 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
2b890 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  age>=0 ){.    if
2b8a0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b  ( pCur->iPage ){
2b8b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2b8c0 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
2b8d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 77 68  pPage);.      wh
2b8e0 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69 50 61  ile( --pCur->iPa
2b8f0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ge ){.        re
2b900 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
2b910 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
2b920 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 20  ur->iPage]);.   
2b930 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2b940 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
2b950 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20 20 20  pPage[0];.      
2b960 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
2b970 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2b980 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2b990 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
2b9a0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2b9b0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
2b9c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54  turn SQLITE_EMPT
2b9d0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
2b9e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2b9f0 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20  age==(-1) );.   
2ba00 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ba10 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
2ba20 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20 20 69  ESEEK ){.      i
2ba30 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2ba40 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2ba50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ba60 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
2ba70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2ba80 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
2ba90 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
2baa0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2bab0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
2bac0 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  or(pCur);.    }.
2bad0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
2bae0 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42  nitPage(pCur->pB
2baf0 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d  tree->pBt, pCur-
2bb00 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
2bb10 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20  ->pPage,.       
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb30 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67   0, pCur->curPag
2bb40 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  erFlags);.    if
2bb50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bb60 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
2bb70 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2bb80 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
2bb90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2bba0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
2bbb0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
2bbc0 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e  rIntKey = pCur->
2bbd0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20  pPage->intKey;. 
2bbe0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
2bbf0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
2bc00 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
2bc10 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
2bc20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
2bc30 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
2bc40 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
2bc50 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
2bc60 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
2bc70 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
2bc80 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
2bc90 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
2bca0 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
2bcb0 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
2bcc0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
2bcd0 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
2bce0 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
2bcf0 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
2bd00 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
2bd10 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
2bd20 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
2bd30 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
2bd40 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
2bd50 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
2bd60 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
2bd70 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
2bd80 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
2bd90 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
2bda0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
2bdb0 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
2bdc0 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
2bdd0 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
2bde0 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
2bdf0 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
2be00 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
2be10 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
2be20 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
2be30 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
2be40 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
2be50 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
2be60 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
2be70 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
2be80 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
2be90 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
2bea0 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
2beb0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
2bec0 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
2bed0 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
2bee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2bef0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 43 75 72  ORRUPT_PAGE(pCur
2bf00 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 73  ->pPage);.  }..s
2bf10 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43  kip_init:  .  pC
2bf20 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43  ur->ix = 0;.  pC
2bf30 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2bf40 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2bf50 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2bf60 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2bf70 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2bf80 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d  vfl);..  pRoot =
2bf90 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2bfa0 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
2bfb0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
2bfc0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2bfd0 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
2bfe0 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
2bff0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
2c000 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
2c010 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
2c020 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2c030 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
2c040 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
2c050 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
2c060 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
2c070 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
2c080 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2c090 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
2c0a0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2c0b0 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
2c0c0 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
2c0d0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2c0e0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
2c0f0 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
2c100 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c110 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2c120 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2c130 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
2c140 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
2c150 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
2c160 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
2c170 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
2c180 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
2c190 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
2c1a0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
2c1b0 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
2c1c0 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
2c1d0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2c1e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2c1f0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
2c200 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
2c210 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
2c220 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c230 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2c240 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2c250 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2c260 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2c270 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2c280 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2c290 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2c2a0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
2c2b0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
2c2c0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
2c2d0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2c2e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2c2f0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2c300 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2c310 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20  e, pCur->ix));. 
2c320 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2c330 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2c340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2c360 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
2c370 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
2c380 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
2c390 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
2c3a0 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
2c3b0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2c3c0 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
2c3d0 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
2c3e0 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
2c3f0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
2c400 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
2c410 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
2c420 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
2c430 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
2c440 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
2c450 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
2c460 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
2c470 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
2c480 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
2c490 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
2c4a0 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
2c4b0 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
2c4c0 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
2c4d0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
2c4e0 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
2c4f0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2c500 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2c510 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
2c520 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
2c530 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
2c540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c550 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2c560 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2c570 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2c580 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2c590 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2c5a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2c5b0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
2c5c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2c5d0 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
2c5e0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2c5f0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2c600 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2c610 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
2c620 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ix = pPage->nCel
2c630 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
2c640 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2c650 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
2c660 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
2c670 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50  .  pCur->ix = pP
2c680 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2c690 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2c6a0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2c6b0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2c6c0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2c6d0 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
2c6e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c6f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
2c700 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2c710 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2c720 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2c730 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2c740 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2c750 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2c760 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2c770 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2c780 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2c790 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2c7a0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2c7b0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2c7c0 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
2c7d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2c7e0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2c7f0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
2c800 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2c810 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2c820 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c830 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2c840 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2c850 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
2c860 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2c870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c880 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2c890 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2c8a0 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  l>0 );.    *pRes
2c8b0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
2c8c0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2c8d0 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ur);.  }else if(
2c8e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
2c8f0 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
2c900 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2c910 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
2c920 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2c930 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2c940 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2c950 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2c960 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
2c970 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2c980 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2c990 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2c9a0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
2c9b0 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
2c9c0 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
2c9d0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
2c9e0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
2c9f0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
2ca00 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
2ca10 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2ca20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2ca30 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
2ca40 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2ca50 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2ca60 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2ca70 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2ca80 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2ca90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2caa0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2cab0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2cac0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2cad0 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
2cae0 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
2caf0 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
2cb00 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
2cb10 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
2cb20 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70  ur->eState && (p
2cb30 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2cb40 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2cb50 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2cb60 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
2cb70 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
2cb80 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
2cb90 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
2cba0 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
2cbb0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
2cbc0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
2cbd0 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
2cbe0 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
2cbf0 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
2cc00 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
2cc10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2cc20 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
2cc30 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
2cc40 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
2cc50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d  ssert( pCur->ix=
2cc60 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  =pCur->pPage->nC
2cc70 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
2cc80 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2cc90 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
2cca0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ccb0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
2ccc0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2ccd0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
2cce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ccf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2cd00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2cd10 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ID );.    *pRes 
2cd20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
2cd30 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
2cd40 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ur);.    if( rc=
2cd50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cd60 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2cd70 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73  gs |= BTCF_AtLas
2cd80 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2cd90 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2cda0 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
2cdb0 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  st;.    }.  }els
2cdc0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2cdd0 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73  _EMPTY ){.    as
2cde0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2cdf0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2ce00 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
2ce10 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
2ce20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
2ce30 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
2ce40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
2ce50 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
2ce60 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2ce70 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
2ce80 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
2ce90 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
2cea0 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
2ceb0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
2cec0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
2ced0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
2cee0 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
2cef0 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
2cf00 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
2cf10 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
2cf20 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
2cf30 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
2cf40 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
2cf50 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
2cf60 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
2cf70 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
2cf80 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
2cf90 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
2cfa0 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
2cfb0 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
2cfc0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
2cfd0 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
2cfe0 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
2cff0 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
2d000 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
2d010 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
2d020 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
2d030 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
2d040 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
2d050 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
2d060 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
2d070 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
2d080 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
2d090 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
2d0a0 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
2d0b0 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
2d0c0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
2d0d0 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
2d0e0 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
2d0f0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2d100 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
2d110 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
2d120 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2d130 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
2d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d150 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
2d160 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2d170 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
2d180 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
2d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
2d1a0 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
2d1b0 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
2d1c0 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
2d1d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2d1e0 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
2d1f0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2d200 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2d210 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2d220 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
2d230 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
2d240 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
2d250 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
2d260 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2d270 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2d280 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2a0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2d2b0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
2d2c0 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20  **.** For index 
2d2d0 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78  tables, the pIdx
2d2e0 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c  Key->eqSeen fiel
2d2f0 64 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66  d is set to 1 if
2d300 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73   there.** exists
2d310 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2d320 20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63   table that exac
2d330 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78  tly matches pIdx
2d340 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  Key.  .*/.int sq
2d350 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2d360 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
2d370 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2d380 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
2d390 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
2d3a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
2d3b0 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
2d3c0 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
2d3d0 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
2d3e0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
2d3f0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
2d400 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
2d410 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
2d420 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
2d430 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
2d440 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
2d450 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
2d460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2d470 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
2d480 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
2d490 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43  nt rc;.  RecordC
2d4a0 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f  ompare xRecordCo
2d4b0 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74  mpare;..  assert
2d4c0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d4d0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d4e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2d4f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2d500 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2d510 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2d520 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
2d530 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
2d540 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
2d550 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
2d560 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2d570 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2d580 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2d590 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d  Cur->curIntKey!=
2d5a0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
2d5b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
2d5c0 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
2d5d0 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
2d5e0 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
2d5f0 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
2d600 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
2d610 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
2d620 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64  ork */.  if( pId
2d630 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43  xKey==0.   && pC
2d640 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d650 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75  OR_VALID && (pCu
2d660 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2d670 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30  CF_ValidNKey)!=0
2d680 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
2d690 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
2d6a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2d6b0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2d6c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d6d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d6e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
2d6f0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2d700 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
2d710 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2d720 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
2d730 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2d740 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d750 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2d760 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
2d770 65 71 75 65 73 74 65 64 20 6b 65 79 20 69 73 20  equested key is 
2d780 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
2d790 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20  e previous key, 
2d7a0 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72  then.      ** tr
2d7b0 79 20 74 6f 20 67 65 74 20 74 68 65 72 65 20 75  y to get there u
2d7c0 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65  sing sqlite3Btre
2d7d0 65 4e 65 78 74 28 29 20 72 61 74 68 65 72 20 74  eNext() rather t
2d7e0 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20  han a full.     
2d7f0 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63   ** binary searc
2d800 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  h.  This is an o
2d810 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
2d820 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74 20 61  .  The correct a
2d830 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  nswer.      ** i
2d840 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64  s still obtained
2d850 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 63 61   without this ca
2d860 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c  se, only a littl
2d870 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a  e more slowely *
2d880 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
2d890 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69  ->info.nKey+1==i
2d8a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2d8b0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2d8c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d8d0 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
2d8e0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2d8f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d900 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 43 65  .          getCe
2d910 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
2d920 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
2d930 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
2d940 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2d950 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d960 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
2d970 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2d980 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
2d990 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
2d9a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d9b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d9c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2d9d0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2d9e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2d9f0 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
2da00 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2da10 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  pare = sqlite3Vd
2da20 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49  beFindCompare(pI
2da30 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78  dxKey);.    pIdx
2da40 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  Key->errCode = 0
2da50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
2da60 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2da70 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c  c==1 .         |
2da80 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
2da90 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20  lt_rc==0 .      
2daa0 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2dab0 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20  efault_rc==-1.  
2dac0 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
2dad0 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
2dae0 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79   = 0; /* All key
2daf0 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a  s are integers *
2db00 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  /.  }..  rc = mo
2db10 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2db20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2db30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
2db40 4d 50 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73  MPTY ){.      as
2db50 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2db60 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2db70 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
2db80 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
2db90 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
2dba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2dbb0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
2dbc0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2dbd0 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
2dbe0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dbf0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2dc00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2dc10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2dc20 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2dc30 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
2dc40 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61  nCell > 0 );.  a
2dc50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2dc60 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ge==0 || pCur->a
2dc70 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2dc80 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
2dc90 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
2dca0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
2dcb0 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
2dcc0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
2dcd0 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
2dce0 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
2dcf0 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
2dd00 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2dd10 61 67 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  age;.    u8 *pCe
2dd20 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dd40 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
2dd50 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
2dd60 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
2dd70 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
2dd80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
2dd90 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
2dda0 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
2ddb0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
2ddc0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
2ddd0 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
2dde0 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
2ddf0 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
2de00 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
2de10 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
2de20 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
2de30 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
2de40 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
2de50 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
2de60 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
2de70 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
2de80 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
2de90 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
2dea0 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
2deb0 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
2dec0 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
2ded0 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
2dee0 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
2def0 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
2df00 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
2df10 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
2df20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2df30 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
2df40 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2df50 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
2df60 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
2df70 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
2df80 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
2df90 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
2dfa0 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
2dfb0 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
2dfc0 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
2dfd0 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
2dfe0 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
2dff0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2e000 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2e010 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
2e020 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
2e030 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2e040 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
2e050 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
2e060 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2e070 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2e080 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20  e, idx);.       
2e090 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2e0a0 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  eyLeaf ){.      
2e0b0 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
2e0c0 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
2e0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e0e0 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
2e0f0 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20  DataEnd ){.     
2e100 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2e110 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2e120 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
2e130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2e150 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
2e160 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
2e170 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
2e180 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c     if( nCellKey<
2e190 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2e1a0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
2e1b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2e1c0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31  wr>upr ){ c = -1
2e1d0 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2e1e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
2e1f0 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a  llKey>intKey ){.
2e200 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2e210 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  idx-1;.         
2e220 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2e230 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d  c = +1; break; }
2e240 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2e250 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e260 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
2e270 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
2e280 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2e290 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2e2a0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2e2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
2e2c0 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
2e2d0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2e2e0 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20  o_next_layer;.  
2e2f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2e300 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2e310 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2e320 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
2e330 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2e340 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
2e350 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2e360 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e370 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2e380 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2e390 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2e3a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e3c0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2e3d0 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2e3e0 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2e3f0 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2e400 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2e410 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  2; */.      }.  
2e420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
2e430 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2e440 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53  int nCell;  /* S
2e450 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c  ize of the pCell
2e460 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a   cell in bytes *
2e470 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  /.        pCell 
2e480 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2e490 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a  r(pPage, idx);..
2e4a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
2e4b0 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
2e4c0 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
2e4d0 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
2e4e0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
2e4f0 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
2e500 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
2e510 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
2e520 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
2e530 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
2e540 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
2e550 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
2e560 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2e570 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
2e580 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
2e590 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2e5a0 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
2e5b0 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
2e5c0 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
2e5d0 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
2e5e0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
2e5f0 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
2e600 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
2e610 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
2e620 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
2e630 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
2e640 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
2e650 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
2e660 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
2e670 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
2e680 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  */.        nCell
2e690 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
2e6a0 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
2e6b0 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
2e6c0 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
2e6d0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2e6e0 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
2e6f0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2e700 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
2e710 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
2e720 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
2e730 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2e740 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2e750 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
2e760 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
2e770 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
2e780 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
2e790 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67  ll+nCell+1==pPag
2e7a0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
2e7b0 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2e7c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2e7d0 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
2e7e0 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
2e7f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2e800 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
2e810 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
2e820 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
2e830 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
2e840 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
2e850 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
2e860 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
2e870 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
2e880 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
2e890 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2e8a0 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
2e8b0 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
2e8c0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2e8d0 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
2e8e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2e8f0 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2e900 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+2==pPage->aDa
2e910 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2e920 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2e930 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2e940 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
2e950 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2e960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e970 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
2e980 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
2e990 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
2e9a0 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
2e9b0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
2e9c0 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
2e9d0 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
2e9e0 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
2e9f0 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
2ea00 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
2ea10 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
2ea20 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
2ea30 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
2ea40 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
2ea50 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
2ea60 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
2ea70 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
2ea80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
2ea90 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2eaa0 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72  e record is corr
2eab0 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64  upt, the xRecord
2eac0 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20  Compare routine 
2ead0 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20  may read.       
2eae0 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20     ** up to two 
2eaf0 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65  varints past the
2eb00 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
2eb10 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20  er. An extra 18 
2eb20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
2eb30 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69  tes of padding i
2eb40 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74  s allocated at t
2eb50 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2eb60 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20  ffer in.        
2eb70 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68    ** case this h
2eb80 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20  appens.  */.    
2eb90 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
2eba0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2ebb0 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
2ebc0 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
2ebd0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
2ebe0 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  ze;.          pP
2ebf0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
2ec00 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
2ec10 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
2ec20 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
2ec30 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
2ec40 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
2ec50 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2ec60 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65  l<0 );   /* True
2ec70 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20   if key size is 
2ec80 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a  2^32 or more */.
2ec90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2eca0 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20  se( nCell==0 ); 
2ecb0 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2ecc0 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2ecd0 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20   0x00 */.       
2ece0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2ecf0 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==1 );  /* Inv
2ed00 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2ed10 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a  0x80 0x80 0x01 *
2ed20 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2ed30 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29  case( nCell==2 )
2ed40 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65  ;  /* Minimum le
2ed50 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69  gal index key si
2ed60 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
2ed70 69 66 28 20 6e 43 65 6c 6c 3c 32 20 7c 7c 20 6e  if( nCell<2 || n
2ed80 43 65 6c 6c 2f 70 43 75 72 2d 3e 70 42 74 2d 3e  Cell/pCur->pBt->
2ed90 75 73 61 62 6c 65 53 69 7a 65 3e 70 43 75 72 2d  usableSize>pCur-
2eda0 3e 70 42 74 2d 3e 6e 50 61 67 65 20 29 7b 0a 20  >pBt->nPage ){. 
2edb0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2edc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2edd0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
2ede0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2edf0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2ee00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ee10 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
2ee20 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
2ee30 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
2ee40 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
2ee50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ee60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2ee70 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
2ee80 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2ee90 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2eea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2eeb0 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2eec0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
2eed0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
2eee0 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
2eef0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2ef00 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
2ef10 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
2ef20 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2ef30 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
2ef40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2ef50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ef60 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2ef70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2ef80 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2ef90 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2efa0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
2efb0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
2efc0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
2efd0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
2efe0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2eff0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2f000 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
2f010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20        assert( . 
2f020 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78             (pIdx
2f030 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2f040 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20  LITE_CORRUPT || 
2f050 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26  c==0).         &
2f060 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  & (pIdxKey->errC
2f070 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  ode!=SQLITE_NOME
2f080 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65  M || pCur->pBtre
2f090 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2f0a0 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  led).        );.
2f0b0 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20          if( c<0 
2f0c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2f0d0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2f0e0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20    }else if( c>0 
2f0f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2f100 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2f110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f120 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20     assert( c==0 
2f130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  );.          *pR
2f140 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2f150 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f160 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2f170 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2f180 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2f190 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2f1a0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
2f1b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2f1c0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2f1d0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2f1e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2f1f0 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
2f200 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f210 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2f220 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2f230 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2f240 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2f250 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2f260 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
2f270 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
2f280 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2f290 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
2f2a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2f2b0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2f2c0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2f2d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2f2e0 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e   pCur->ix<pCur->
2f2f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2f300 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
2f310 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2f320 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
2f330 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f340 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
2f350 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2f360 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
2f370 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
2f380 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2f390 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2f3a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2f3b0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2f3c0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2f3d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2f3e0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2f3f0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2f400 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
2f410 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2f420 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
2f430 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2f440 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
2f450 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2f460 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
2f470 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
2f480 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  Size = 0;.  asse
2f490 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2f4a0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2f4b0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65  Ovfl)==0 );.  re
2f4c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2f4d0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2f4e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2f4f0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
2f500 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
2f510 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
2f520 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
2f530 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
2f540 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
2f550 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
2f560 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
2f570 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
2f580 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2f590 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
2f5a0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
2f5b0 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
2f5c0 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
2f5d0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2f5e0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2f5f0 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
2f600 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
2f610 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
2f620 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
2f630 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2f640 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
2f650 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
2f660 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
2f670 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
2f680 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
2f690 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2f6a0 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
2f6b0 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
2f6c0 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
2f6d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
2f6e0 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
2f6f0 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
2f700 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73  .** Return an es
2f710 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e  timate for the n
2f720 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2f730 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
2f740 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74  pCur is.** point
2f750 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20  ing to.  Return 
2f760 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2f770 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65  r if no estimate
2f780 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a   is currently .*
2f790 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  * available..*/.
2f7a0 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
2f7b0 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75  RowCountEst(BtCu
2f7c0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2f7d0 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20  64 n;.  u8 i;.. 
2f7e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2f7f0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2f800 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2f810 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2f820 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2f830 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2f840 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68   /* Currently th
2f850 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  is interface is 
2f860 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74  only called by t
2f870 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a  he OP_IfSmaller.
2f880 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64    ** opcode, and
2f890 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74 68   it that case th
2f8a0 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c  e cursor will al
2f8b0 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e  ways be valid an
2f8c0 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61  d.  ** will alwa
2f8d0 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65  ys point to a le
2f8e0 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  af node. */.  if
2f8f0 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53  ( NEVER(pCur->eS
2f900 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2f910 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ID) ) return -1;
2f920 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
2f930 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  r->pPage->leaf==
2f940 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0) ) return -1;.
2f950 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61  .  n = pCur->pPa
2f960 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72  ge->nCell;.  for
2f970 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50  (i=0; i<pCur->iP
2f980 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  age; i++){.    n
2f990 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65   *= pCur->apPage
2f9a0 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  [i]->nCell;.  }.
2f9b0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
2f9c0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2f9d0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2f9e0 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2f9f0 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52   database. .** R
2fa00 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a  eturn value:.**.
2fa10 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  **    SQLITE_OK 
2fa20 20 20 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a         success.*
2fa30 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45  *    SQLITE_DONE
2fa40 20 20 20 20 20 20 63 75 72 73 6f 72 20 69 73 20        cursor is 
2fa50 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2fa60 20 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65   at the last ele
2fa70 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72  ment.**    other
2fa80 77 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65  wise        some
2fa90 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f   kind of error o
2faa0 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68  ccurred.**.** Th
2fab0 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2fac0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2fad0 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20  eeNext().  That 
2fae0 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2faf0 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2fb00 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2fb10 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69  erely incrementi
2fb20 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2fb30 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2fb40 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78  dx.** to the nex
2fb50 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  t cell on the cu
2fb60 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2fb70 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e   (slower) btreeN
2fb80 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20  ext() helper.** 
2fb90 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2fba0 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2fbb0 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2fbc0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2fbd0 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74  ge or.** to rest
2fbe0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2fbf0 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
2fc00 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
2fc10 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ent in sqlite3Bt
2fc20 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20  reeNext(C,F) is 
2fc30 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63  1, then the.** c
2fc40 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2fc50 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2fc60 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  x and this routi
2fc70 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2fc80 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66  en.** skipped if
2fc90 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68   the SQL index h
2fca0 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65  ad been a unique
2fcb0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61   index.  The F a
2fcc0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  rgument.** is a 
2fcd0 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
2fce0 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62  ement.  SQLite b
2fcf0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2fd00 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ion does not use
2fd10 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62  .** this hint, b
2fd20 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
2fd30 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2fd40 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2fd50 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2fd60 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
2fd70 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
2fd80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2fd90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2fda0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2fdb0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
2fdc0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2fdd0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
2fde0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2fdf0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2fe00 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2fe10 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2fe20 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2fe30 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2fe40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fe50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2fe60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2fe70 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2fe80 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2fe90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fea0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20  _DONE;.    }.   
2feb0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2fec0 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2fed0 58 54 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  XT ){.      pCur
2fee0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2fef0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2ff00 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2ff10 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
2ff20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2ff30 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2ff40 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64 78 20  r->pPage;.  idx 
2ff50 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20  = ++pCur->ix;.  
2ff60 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
2ff70 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  it ){.    /* The
2ff80 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20   only known way 
2ff90 66 6f 72 20 74 68 69 73 20 74 6f 20 68 61 70 70  for this to happ
2ffa0 65 6e 20 69 73 20 66 6f 72 20 74 68 65 72 65 20  en is for there 
2ffb0 74 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 72  to be a.    ** r
2ffc0 65 63 75 72 73 69 76 65 20 53 51 4c 20 66 75 6e  ecursive SQL fun
2ffd0 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20  ction that does 
2ffe0 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  a DELETE operati
2fff0 6f 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 0a  on as part of a.
30000 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 77 68      ** SELECT wh
30010 69 63 68 20 64 65 6c 65 74 65 73 20 63 6f 6e 74  ich deletes cont
30020 65 6e 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ent out from und
30030 65 72 20 61 6e 20 61 63 74 69 76 65 20 63 75 72  er an active cur
30040 73 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20  sor.    ** in a 
30050 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
30060 20 66 69 6c 65 20 77 68 65 72 65 20 74 68 65 20   file where the 
30070 74 61 62 6c 65 20 62 65 69 6e 67 20 44 45 4c 45  table being DELE
30080 54 45 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  TE-ed from.    *
30090 2a 20 68 61 73 20 70 61 67 65 73 20 69 6e 20 63  * has pages in c
300a0 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 74  ommon with the t
300b0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
300c0 65 64 2e 20 20 53 65 65 20 54 48 33 0a 20 20 20  ed.  See TH3.   
300d0 20 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f   ** module cov1/
300e0 62 74 72 65 65 37 38 2e 74 65 73 74 20 74 65 73  btree78.test tes
300f0 74 63 61 73 65 20 32 32 30 20 28 32 30 31 38 2d  tcase 220 (2018-
30100 30 36 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20 20  06-08) for an.  
30110 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f    ** example. */
30120 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
30130 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
30140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
30150 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30160 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
30170 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
30180 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
30190 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
301a0 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
301b0 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
301c0 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
301d0 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
301e0 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
301f0 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
30200 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
30210 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
30220 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
30230 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
30240 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
30250 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
30260 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
30270 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
30280 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
30290 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
302a0 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
302b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
302c0 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
302d0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
302e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
302f0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
30300 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
30310 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
30320 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
30330 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
30340 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30350 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
30360 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
30370 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
30380 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
30390 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
303a0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
303b0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
303c0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
303d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
303e0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
303f0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
30400 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
30410 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
30420 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
30430 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e  Cur->ix>=pPage->
30440 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
30450 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
30460 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
30470 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
30480 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65  pCur, 0);.    }e
30490 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
304a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
304b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61   }.  }.  if( pPa
304c0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
304d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
304e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
304f0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
30500 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
30510 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
30520 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
30530 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73  *pCur, int flags
30540 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
30550 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  age;.  UNUSED_PA
30560 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29  RAMETER( flags )
30570 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f  ;  /* Used in CO
30580 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74  MDB2 but not nat
30590 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20  ive SQLite */.  
305a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
305b0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
305c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
305d0 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
305e0 3d 31 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  =1 );.  pCur->in
305f0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
30600 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
30610 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
30620 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
30630 6c 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  l);.  if( pCur->
30640 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
30650 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74  ALID ) return bt
30660 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20  reeNext(pCur);. 
30670 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
30680 50 61 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70  Page;.  if( (++p
30690 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d  Cur->ix)>=pPage-
306a0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43  >nCell ){.    pC
306b0 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65  ur->ix--;.    re
306c0 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
306d0 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Cur);.  }.  if( 
306e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
306f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30700 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
30710 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
30720 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
30730 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70   }.}../*.** Step
30740 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
30750 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
30760 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
30770 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
30780 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a  * Return values:
30790 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
307a0 45 5f 4f 4b 20 20 20 20 20 73 75 63 63 65 73 73  E_OK     success
307b0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 44  .**     SQLITE_D
307c0 4f 4e 45 20 20 20 74 68 65 20 63 75 72 73 6f 72  ONE   the cursor
307d0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74   is already on t
307e0 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
307f0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
30800 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20       otherwise  
30810 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20     some kind of 
30820 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a  error occurred.*
30830 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
30840 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
30850 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
30860 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  s().  That routi
30870 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
30880 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
30890 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
308a0 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   decrementing th
308b0 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
308c0 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
308d0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
308e0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
308f0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
30900 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72  (slower) btreePr
30910 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70  evious().** help
30920 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  er routine is ca
30930 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
30940 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
30950 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
30960 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72   page.** or to r
30970 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
30980 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20  r..**.** If bit 
30990 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61 72  0x01 of the F ar
309a0 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65  gument to sqlite
309b0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 43  3BtreePrevious(C
309c0 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a  ,F) is 1, then.*
309d0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72  * the cursor cor
309e0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
309f0 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69  QL index and thi
30a00 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
30a10 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69  have been.** ski
30a20 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20  pped if the SQL 
30a30 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61  index had been a
30a40 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
30a50 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69  The F argument i
30a60 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74  s a.** hint to t
30a70 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54  he implement.  T
30a80 68 65 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65  he native SQLite
30a90 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
30aa0 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  ation does not.*
30ab0 2a 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  * use this hint,
30ac0 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73   but COMDB2 does
30ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
30ae0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
30af0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  btreePrevious(Bt
30b00 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
30b10 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
30b20 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
30b30 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
30b40 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
30b50 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
30b60 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
30b70 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
30b80 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
30b90 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b  alidNKey))==0 );
30ba0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
30bb0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
30bc0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
30bd0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
30be0 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  ID ){.    rc = r
30bf0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
30c00 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
30c10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30c20 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
30c30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
30c40 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
30c50 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
30c60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
30c70 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
30c80 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
30c90 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75  OR_SKIPNEXT==pCu
30ca0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
30cb0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
30cc0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
30cd0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
30ce0 73 6b 69 70 4e 65 78 74 3c 30 20 29 20 72 65 74  skipNext<0 ) ret
30cf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
30d00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
30d10 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
30d20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30d30 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
30d40 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
30d50 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
30d60 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63  pCur->ix;.    rc
30d70 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
30d80 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
30d90 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
30da0 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
30db0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30dc0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
30dd0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
30de0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
30df0 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b  ( pCur->ix==0 ){
30e00 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
30e10 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
30e20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
30e30 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
30e40 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
30e50 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
30e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
30e70 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
30e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
30e90 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
30ea0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
30eb0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
30ec0 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
30ed0 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
30ee0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  ..    pCur->ix--
30ef0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
30f00 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69  ur->pPage;.    i
30f10 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
30f20 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
30f30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
30f40 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
30f50 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ous(pCur, 0);.  
30f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
30f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30f80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
30f90 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
30fa0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
30fb0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
30fc0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
30fd0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
30fe0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
30ff0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
31000 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
31010 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
31020 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29  RAMETER( flags )
31030 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f  ;  /* Used in CO
31040 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74  MDB2 but not nat
31050 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20  ive SQLite */.  
31060 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
31070 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
31080 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
31090 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a  TCF_ValidNKey);.
310a0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
310b0 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  ze = 0;.  if( pC
310c0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
310d0 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70  OR_VALID.   || p
310e0 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c  Cur->ix==0.   ||
310f0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65   pCur->pPage->le
31100 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  af==0.  ){.    r
31110 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69  eturn btreePrevi
31120 6f 75 73 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ous(pCur);.  }. 
31130 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72   pCur->ix--;.  r
31140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
31160 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
31170 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
31180 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
31190 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
311a0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
311b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
311c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
311d0 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
311e0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
311f0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
31200 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
31210 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
31220 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
31230 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
31240 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
31250 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
31260 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
31270 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
31280 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
31290 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
312a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
312b0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
312c0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
312d0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
312e0 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
312f0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
31300 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ULL in the event
31310 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
31320 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
31330 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
31340 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
31350 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
31360 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
31370 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
31380 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
31390 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
313a0 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
313b0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
313c0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
313d0 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
313e0 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
313f0 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
31400 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
31410 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
31420 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
31430 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
31440 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
31450 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
31460 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
31470 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
31480 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
31490 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
314a0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
314b0 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
314c0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
314d0 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
314e0 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
314f0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
31500 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
31510 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
31520 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
31530 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
31540 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
31550 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
31560 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
31570 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
31580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31590 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
315a0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
315b0 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
315c0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
315d0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
315e0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
315f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
31600 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
31610 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
31620 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
31630 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
31640 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
31650 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
31660 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
31670 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
31680 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
31690 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
316a0 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
316b0 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
316c0 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
316d0 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
316e0 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
316f0 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
31700 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31710 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
31720 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
31730 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
31740 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
31750 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
31760 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
31770 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
31780 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
31790 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
317a0 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
317b0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
317c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
317d0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
317e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
317f0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
31800 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
31810 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
31820 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
31830 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
31840 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
31850 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
31860 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
31870 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
31880 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
31890 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
318a0 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
318b0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
318c0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
318d0 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
318e0 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
318f0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
31900 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
31910 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
31920 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31930 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
31940 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
31950 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
31960 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
31970 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31980 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
31990 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
319a0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
319b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
319c0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
319d0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
319e0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
319f0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
31a00 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
31a10 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
31a20 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
31a30 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
31a40 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
31a50 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
31a60 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
31a70 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
31a80 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
31a90 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
31aa0 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
31ab0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31ac0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
31ad0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
31ae0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
31af0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
31b00 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
31b10 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
31b20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
31b30 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
31b40 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
31b50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31b60 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
31b70 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
31b80 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
31b90 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
31ba0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
31bb0 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
31bc0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
31bd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31be0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31bf0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31c00 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
31c10 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
31c20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31c30 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31c40 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
31c50 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
31c60 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
31c70 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
31c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31c90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
31ca0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
31cb0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
31cc0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
31cd0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
31ce0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
31cf0 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
31d00 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
31d10 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
31d20 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
31d30 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
31d40 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
31d50 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
31d60 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
31d70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31d80 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
31d90 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
31da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31db0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
31dc0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
31dd0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
31de0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
31df0 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
31e00 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
31e10 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
31e20 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
31e30 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
31e40 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
31e50 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
31e60 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
31e70 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
31e80 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
31e90 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
31ea0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
31eb0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
31ec0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
31ed0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
31ee0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
31ef0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
31f00 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
31f10 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
31f20 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
31f30 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
31f40 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
31f50 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
31f60 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
31f70 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
31f80 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
31f90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
31fa0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
31fb0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
31fc0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
31fd0 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
31fe0 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
31ff0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
32000 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
32010 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
32020 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
32030 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
32040 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
32050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32060 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
32070 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
32080 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
32090 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
320a0 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
320b0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
320c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
320d0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
320e0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
320f0 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
32100 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
32110 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
32120 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
32130 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
32140 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
32150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
32160 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
32170 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
32180 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
32190 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
321a0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
321b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
321c0 5f 50 47 4e 4f 28 70 50 72 65 76 54 72 75 6e 6b  _PGNO(pPrevTrunk
321d0 20 3f 20 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70   ? pPrevTrunk->p
321e0 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20 20 20 20  gno : 1);.      
321f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
32200 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
32210 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  edPage(pBt, iTru
32220 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
32230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32240 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
32250 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
32260 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32270 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32280 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
32290 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
322a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
322b0 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
322c0 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  ;.      /* EVIDE
322d0 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d  NCE-OF: R-13523-
322e0 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64  04394 The second
322f0 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
32300 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
32310 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  e.      ** is th
32320 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
32330 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74   page pointers t
32340 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20  o follow. */.   
32350 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
32360 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
32370 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
32380 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
32390 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
323a0 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
323b0 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
323c0 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
323d0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
323e0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
323f0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
32400 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
32410 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
32420 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
32430 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
32440 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
32450 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
32460 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32470 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32480 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
32490 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
324a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
324b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
324c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
324d0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
324e0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
324f0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
32500 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
32510 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
32520 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
32530 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
32540 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
32550 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
32560 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
32570 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
32580 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
32590 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
325a0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
325b0 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
325c0 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
325d0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
325e0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
325f0 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
32600 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
32610 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32620 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72  CORRUPT_PGNO(iTr
32630 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  unk);.        go
32640 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32650 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
32660 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32670 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
32680 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
32690 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
326a0 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20  (nearby==iTrunk 
326b0 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62  || (iTrunk<nearb
326c0 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
326d0 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
326e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
326f0 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
32700 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
32710 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
32720 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
32730 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
32740 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
32750 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
32760 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
32770 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
32780 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
32790 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
327a0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
327b0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
327c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
327d0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
327e0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
327f0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
32800 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32810 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32830 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
32840 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
32850 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
32860 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32870 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
32880 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
32890 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
328a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
328b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
328c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
328d0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
328e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
328f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32900 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
32910 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32920 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32940 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
32950 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
32960 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
32970 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
32980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
32990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
329a0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
329b0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
329c0 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
329d0 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
329e0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
329f0 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
32a00 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
32a10 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
32a20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
32a30 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
32a40 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
32a50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
32a60 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
32a70 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
32a80 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
32a90 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
32aa0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
32ab0 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
32ac0 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
32ad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
32ae0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
32af0 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (iTrunk);.      
32b00 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32b10 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32b30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
32b40 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
32b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
32b60 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
32b70 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
32b80 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
32b90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
32ba0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32bc0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
32bd0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
32be0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
32bf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32c00 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
32c10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
32c20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32c30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32c40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32c50 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
32c60 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32c70 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32c80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32c90 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
32ca0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
32cb0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
32cc0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
32cd0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
32ce0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
32cf0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
32d00 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
32d10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
32d20 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
32d30 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
32d40 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
32d50 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
32d60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
32d70 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
32d80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
32d90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
32da0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
32db0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
32dc0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
32dd0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
32de0 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
32df0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
32e00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
32e10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32e20 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
32e30 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
32e40 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
32e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32e60 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32e70 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32e90 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
32ea0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
32eb0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
32ec0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32ed0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
32ee0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
32ef0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
32f00 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
32f10 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
32f20 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
32f30 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
32f40 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
32f50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
32f60 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
32f70 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
32f80 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
32f90 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
32fa0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
32fb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
32fc0 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
32fd0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
32fe0 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
32ff0 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
33000 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
33010 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
33020 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
33030 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  C_LE ){.        
33040 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
33050 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
33060 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
33070 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
33080 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i*4]);.         
33090 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d       if( iPage<=
330a0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
330b0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
330c0 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
330d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
330e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
330f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33110 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
33120 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  t;.            d
33130 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
33140 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
33150 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
33160 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
33170 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
33180 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
33190 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
331a0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
331b0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
331c0 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
331d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
331e0 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
331f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
33200 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
33210 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
33220 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
33230 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
33240 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
33250 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33260 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
33270 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
33280 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
33290 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
332a0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
332b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
332c0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
332d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
332e0 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
332f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
33300 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
33310 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
33320 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
33330 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
33340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
33350 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
33360 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
33370 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
33380 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
33390 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
333a0 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
333b0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
333c0 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
333d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
333e0 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
333f0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
33400 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
33410 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
33420 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
33430 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
33440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33450 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
33460 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
33470 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
33480 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
33490 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
334a0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
334b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
334c0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
334d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
334e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
334f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
33500 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
33510 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
33520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
33530 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
33540 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
33550 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
33560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33570 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
33580 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
33590 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
335a0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
335b0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
335c0 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  gno)? PAGER_GET_
335d0 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
335e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
335f0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
33600 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
33610 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
33620 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
33630 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33640 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
33650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33660 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
33670 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
33680 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
336a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
336b0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
336c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50              *ppP
336d0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
336e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
336f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
33700 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
33710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33720 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
33730 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
33740 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
33750 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
33760 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
33770 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
33780 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
33790 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
337a0 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
337b0 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
337c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
337d0 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
337e0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
337f0 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
33800 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
33810 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
33820 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
33830 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
33840 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
33850 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
33860 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
33870 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
33880 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
33890 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
338a0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
338b0 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
338c0 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
338d0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
338e0 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
338f0 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
33900 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
33910 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
33920 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
33930 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
33940 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
33950 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
33960 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
33970 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
33980 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
33990 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
339a0 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
339b0 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
339c0 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
339d0 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
339e0 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
339f0 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
33a00 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
33a10 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
33a20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
33a30 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
33a40 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
33a50 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
33a60 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
33a70 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
33a80 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
33a90 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
33aa0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
33ab0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
33ac0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
33ad0 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
33ae0 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
33af0 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
33b00 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
33b10 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
33b20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
33b30 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
33b40 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
33b50 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
33b60 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
33b70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33b80 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
33b90 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
33ba0 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
33bb0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
33bc0 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ))? PAGER_GET_NO
33bd0 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20  CONTENT:0;..    
33be0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33bf0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
33c00 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
33c10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
33c20 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
33c30 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
33c40 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
33c50 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
33c60 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
33c70 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
33c80 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33c90 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
33ca0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
33cb0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
33cc0 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
33cd0 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
33ce0 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
33cf0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
33d00 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
33d10 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
33d20 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
33d30 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
33d40 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
33d50 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
33d60 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
33d70 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
33d80 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
33d90 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
33da0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
33db0 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
33dc0 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
33dd0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
33de0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
33df0 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
33e00 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
33e10 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
33e20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
33e30 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
33e40 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
33e50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
33e60 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
33e70 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
33e80 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
33e90 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
33ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33eb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33ec0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33ed0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
33ee0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
33ef0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
33f00 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
33f10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
33f20 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
33f30 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
33f40 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
33f50 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
33f60 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
33f70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
33f80 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
33f90 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
33fa0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
33fb0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
33fc0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
33fd0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
33fe0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33ff0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
34000 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
34010 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
34020 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
34030 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
34040 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
34050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34060 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
34070 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
34080 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
340a0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
340b0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
340c0 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ge = 0;.    }.  
340d0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
340e0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
340f0 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
34100 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
34110 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
34120 7c 7c 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  || *pPgno!=PENDI
34130 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
34140 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
34150 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
34160 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
34170 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
34180 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73  revTrunk);.  ass
34190 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
341a0 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
341b0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
341c0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
341d0 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  e)<=1 );.  asser
341e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
341f0 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   || (*ppPage)->i
34200 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65  sInit==0 );.  re
34210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34220 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
34230 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
34240 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
34250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
34260 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
34270 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
34280 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
34290 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
342a0 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
342b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
342c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
342d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
342e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
342f0 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
34300 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
34310 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
34320 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
34330 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
34340 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
34350 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
34360 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
34370 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
34380 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
34390 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
343a0 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
343b0 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
343c0 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
343d0 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
343e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
343f0 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
34400 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
34410 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
34420 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
34430 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
34440 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
34450 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
34460 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
34470 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
34480 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
34490 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
344a0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
344b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
344c0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
344d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
344e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
344f0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
34500 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
34510 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
34520 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
34530 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
34540 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
34550 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
34560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34570 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
34580 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
34590 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
345a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
345c0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
345d0 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345f0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
34600 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
34610 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
34620 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34630 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
34640 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
34650 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
34660 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20   || iPage>1 );. 
34670 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
34680 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
34690 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
346a0 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 7c 7c    if( iPage<2 ||
346b0 20 69 50 61 67 65 3e 70 42 74 2d 3e 6e 50 61 67   iPage>pBt->nPag
346c0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
346d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
346e0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
346f0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
34700 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
34710 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
34720 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
34730 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
34740 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
34750 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
34760 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
34770 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
34780 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
34790 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
347a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
347b0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
347c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
347d0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
347e0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
347f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
34800 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
34810 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
34820 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
34830 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
34840 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
34850 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
34860 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
34870 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
34880 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
34890 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
348a0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
348b0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
348c0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
348d0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
348e0 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
348f0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
34900 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
34910 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
34920 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
34930 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
34940 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
34950 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
34960 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
34970 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
34980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
34990 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
349a0 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
349b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
349c0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
349d0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
349e0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
349f0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
34a00 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
34a10 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
34a20 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
34a30 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
34a40 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
34a50 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
34a60 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
34a70 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
34a80 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
34a90 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34aa0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
34ab0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
34ac0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
34ad0 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
34ae0 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
34af0 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
34b00 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
34b10 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
34b20 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
34b30 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
34b40 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
34b50 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
34b60 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
34b70 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
34b80 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
34b90 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
34ba0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
34bb0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
34bc0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
34bd0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
34be0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
34bf0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
34c00 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
34c10 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
34c20 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
34c30 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
34c40 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
34c50 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
34c60 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
34c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34c80 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
34c90 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
34ca0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
34cb0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
34cc0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
34cd0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
34ce0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
34cf0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
34d00 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
34d10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
34d30 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34d40 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
34d50 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
34d60 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
34d70 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
34d80 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
34d90 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
34da0 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
34db0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
34dc0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34dd0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34de0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
34df0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
34e00 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
34e10 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
34e20 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
34e30 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
34e40 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
34e50 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
34e60 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
34e70 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
34e80 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
34e90 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
34ea0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
34eb0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
34ec0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
34ed0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
34ee0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
34ef0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
34f00 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
34f10 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
34f20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
34f30 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
34f40 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
34f50 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
34f60 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
34f70 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
34f80 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
34f90 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
34fa0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
34fb0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
34fc0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
34fd0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
34fe0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
34ff0 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
35000 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
35010 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
35020 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
35030 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
35040 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
35050 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
35060 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
35070 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
35080 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
35090 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
350a0 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
350b0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
350c0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
350d0 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
350e0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
350f0 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
35100 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
35110 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
35120 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
35130 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
35140 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
35150 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
35160 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
35170 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
35180 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
35190 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
351a0 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
351b0 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
351c0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
351d0 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
351e0 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
351f0 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
35200 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
35210 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
35220 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
35230 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
35240 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
35250 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
35260 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
35270 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
35280 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
35290 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
352a0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
352b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
352c0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
352d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
352e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
352f0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
35300 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
35310 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
35320 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
35330 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
35340 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
35350 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
35360 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
35370 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
35380 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
35390 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
353a0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
353b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
353c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
353d0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
353e0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
353f0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
35400 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
35410 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
35420 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
35430 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
35440 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
35450 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
35460 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
35470 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
35480 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
35490 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
354a0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
354b0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
354c0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
354d0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
354e0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
354f0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
35500 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
35510 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
35520 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
35530 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
35540 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
35550 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
35560 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
35570 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
35580 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
35590 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
355a0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
355b0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
355c0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
355d0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
355e0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
355f0 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
35600 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
35610 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
35620 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
35630 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
35640 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
35650 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35660 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
35670 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35680 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
35690 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
356a0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
356b0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
356c0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
356d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
356e0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
356f0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
35700 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
35710 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
35720 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
35730 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
35740 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
35750 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
35760 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
35770 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
35780 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
35790 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
357a0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
357b0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
357c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
357d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
357e0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
357f0 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
35800 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
35810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
35820 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
35830 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
35840 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
35850 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
35860 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
35870 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
35880 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
35890 43 65 6c 6c 2e 20 20 53 74 6f 72 65 0a 2a 2a 20  Cell.  Store.** 
358a0 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  size information
358b0 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20   about the cell 
358c0 69 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  in pInfo..*/.sta
358d0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
358e0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
358f0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
35900 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
35910 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c  ontains the Cell
35920 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
35930 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f  har *pCell,    /
35940 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
35950 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43 65  the Cell */.  Ce
35960 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
35970 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69         /* Size i
35980 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
35990 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a   the cell */.){.
359a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
359b0 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
359c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
359d0 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
359e0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
359f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35a00 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
35a10 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
35a20 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
35a30 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
35a40 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28  l, pInfo);.  if(
35a50 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d   pInfo->nLocal==
35a60 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
35a70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
35a80 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
35a90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
35aa0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
35ab0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
35ac0 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
35ad0 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e   pCell + pInfo->
35ae0 6e 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 2d 3e  nSize == pPage->
35af0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 74 65  aDataEnd );.  te
35b00 73 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b 20  stcase( pCell + 
35b10 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 29  (pInfo->nSize-1)
35b20 20 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61   == pPage->aData
35b30 45 6e 64 20 29 3b 0a 20 20 69 66 28 20 70 43 65  End );.  if( pCe
35b40 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  ll + pInfo->nSiz
35b50 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e > pPage->aData
35b60 45 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65  End ){.    /* Ce
35b70 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ll extends past 
35b80 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20  end of page */. 
35b90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35ba0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
35bb0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c  age);.  }.  ovfl
35bc0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
35bd0 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e  pCell + pInfo->n
35be0 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 70 42 74  Size - 4);.  pBt
35bf0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
35c00 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
35c10 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
35c20 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
35c30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
35c40 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
35c50 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  (pInfo->nPayload
35c60 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c   - pInfo->nLocal
35c70 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
35c80 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
35c90 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76  e;.  assert( nOv
35ca0 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f  fl>0 || .    (CO
35cb0 52 52 55 50 54 5f 44 42 20 26 26 20 28 70 49 6e  RRUPT_DB && (pIn
35cc0 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f  fo->nPayload + o
35cd0 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66  vflPageSize)<ovf
35ce0 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a  lPageSize).  );.
35cf0 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
35d00 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
35d10 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
35d20 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
35d30 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
35d40 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62  <2 || ovflPgno>b
35d50 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
35d60 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
35d70 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
35d80 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
35d90 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
35da0 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
35db0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
35dc0 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
35dd0 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
35de0 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
35df0 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
35e00 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
35e10 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
35e20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35e30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
35e40 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
35e50 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
35e60 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
35e70 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
35e80 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
35e90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
35ea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
35eb0 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c  .    if( ( pOvfl
35ec0 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74   || ((pOvfl = bt
35ed0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
35ee0 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30  t, ovflPgno))!=0
35ef0 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ) ).     && sqli
35f00 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
35f10 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50  ount(pOvfl->pDbP
35f20 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20  age)!=1.    ){. 
35f30 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
35f40 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63   no reason any c
35f50 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76  ursor should hav
35f60 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  e an outstanding
35f70 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20   reference .    
35f80 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66    ** to an overf
35f90 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69  low page belongi
35fa0 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61  ng to a cell tha
35fb0 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
35fc0 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20  ed/updated..    
35fd0 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65    ** So if there
35fe0 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61   exists more tha
35ff0 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
36000 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  to this page, th
36010 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  en it .      ** 
36020 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20  must not really 
36030 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
36040 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  age and the data
36050 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
36060 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  rupt. .      ** 
36070 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f  It is helpful to
36080 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66   detect this bef
36090 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65  ore calling free
360a0 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20  Page2(), as .   
360b0 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28     ** freePage2(
360c0 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70  ) may zero the p
360d0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20  age contents if 
360e0 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
360f0 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65  de is.      ** e
36100 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20  nabled. If this 
36110 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20  'overflow' page 
36120 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
36130 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20  page that the.  
36140 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73      ** caller is
36150 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
36160 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73  gh or using in s
36170 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74  ome other way, t
36180 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  his.      ** can
36190 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e   be problematic.
361a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
361b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
361c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
361d0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
361e0 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
361f0 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
36200 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
36210 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
36220 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36230 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
36240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36250 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
36260 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
36270 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
36280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
36290 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
362a0 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
362b0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
362c0 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
362d0 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
362e0 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
362f0 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
36300 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
36310 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
36320 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
36330 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
36340 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
36350 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
36360 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
36370 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
36380 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
36390 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
363a0 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
363b0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
363c0 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
363d0 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
363e0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
363f0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
36400 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
36410 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
36420 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
36430 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
36440 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
36450 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
36460 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
36470 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
36480 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
36490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
364a0 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
364b0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
364c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
364d0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
364e0 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
364f0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
36500 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
36510 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
36520 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
36530 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65 65  */.  const Btree
36540 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20  Payload *pX,    
36550 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77      /* Payload w
36560 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f 6e  ith which to con
36570 73 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c 20  struct the cell 
36580 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
36590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
365b0 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
365c0 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
365d0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
365e0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
365f0 6e 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20 69 6e 74  n, rc, mn;.  int
36600 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
36610 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
36620 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
36630 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
36640 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
36650 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
36660 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  d *pBt;.  Pgno p
36670 67 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6e  gnoOvfl;.  int n
36680 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  Header;..  asser
36690 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
366a0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
366b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
366c0 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
366d0 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
366e0 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
366f0 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
36700 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
36710 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
36720 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
36730 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
36740 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
36750 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
36760 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
36770 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
36780 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  >pBt->pageSize].
36790 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
367a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
367b0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
367c0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
367d0 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
367e0 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
367f0 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
36800 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50  trSize;.  if( pP
36810 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
36820 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58     nPayload = pX
36830 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a  ->nData + pX->nZ
36840 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  ero;.    pSrc = 
36850 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e  pX->pData;.    n
36860 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b  Src = pX->nData;
36870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36880 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
36890 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  ; /* fillInCell(
368a0 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  ) only called fo
368b0 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20 20  r leaves */.    
368c0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
368d0 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
368e0 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
368f0 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  );.    nHeader +
36900 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
36910 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
36920 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a  64*)&pX->nKey);.
36930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
36940 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30  ert( pX->nKey<=0
36950 78 37 66 66 66 66 66 66 66 20 26 26 20 70 58 2d  x7fffffff && pX-
36960 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20  >pKey!=0 );.    
36970 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20  nSrc = nPayload 
36980 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b  = (int)pX->nKey;
36990 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e  .    pSrc = pX->
369a0 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64 65  pKey;.    nHeade
369b0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
369c0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
369d0 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d  , nPayload);.  }
369e0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
369f0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
36a00 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
36a10 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
36a20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
36a30 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
36a40 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
36a50 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
36a60 77 68 65 72 65 20 65 76 65 72 79 74 68 69 6e 67  where everything
36a70 20 66 69 74 73 20 6f 6e 20 74 68 65 20 62 74 72   fits on the btr
36a80 65 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 61  ee page.    ** a
36a90 6e 64 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nd no overflow p
36aa0 61 67 65 73 20 61 72 65 20 72 65 71 75 69 72 65  ages are require
36ab0 64 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d 20 6e 48  d. */.    n = nH
36ac0 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64  eader + nPayload
36ad0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
36ae0 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74  n==3 );.    test
36af0 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20  case( n==4 );.  
36b00 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20    if( n<4 ) n = 
36b10 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  4;.    *pnSize =
36b20 20 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   n;.    assert( 
36b30 6e 53 72 63 3c 3d 6e 50 61 79 6c 6f 61 64 20 29  nSrc<=nPayload )
36b40 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
36b50 6e 53 72 63 3c 6e 50 61 79 6c 6f 61 64 20 29 3b  nSrc<nPayload );
36b60 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
36b70 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 53 72 63  load, pSrc, nSrc
36b80 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
36b90 61 79 6c 6f 61 64 2b 6e 53 72 63 2c 20 30 2c 20  ayload+nSrc, 0, 
36ba0 6e 50 61 79 6c 6f 61 64 2d 6e 53 72 63 29 3b 0a  nPayload-nSrc);.
36bb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36bc0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
36bd0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
36be0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
36bf0 20 74 68 61 74 20 73 6f 6d 65 20 6f 66 20 74 68   that some of th
36c00 65 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 6e  e content will n
36c10 65 65 64 0a 20 20 2a 2a 20 74 6f 20 73 70 69 6c  eed.  ** to spil
36c20 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l onto overflow 
36c30 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 6d 6e  pages..  */.  mn
36c40 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
36c50 61 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20 2b 20 28  al;.  n = mn + (
36c60 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25  nPayload - mn) %
36c70 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
36c80 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
36c90 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
36ca0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
36cb0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
36cc0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
36cd0 31 20 29 3b 0a 20 20 69 66 28 20 6e 20 3e 20 70  1 );.  if( n > p
36ce0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
36cf0 20 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70 61 63 65   n = mn;.  space
36d00 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 2a 70 6e 53  Left = n;.  *pnS
36d10 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65  ize = n + nHeade
36d20 72 20 2b 20 34 3b 0a 20 20 70 50 72 69 6f 72 20  r + 4;.  pPrior 
36d30 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
36d40 2b 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c 65 61 73  +n];.  pToReleas
36d50 65 20 3d 20 30 3b 0a 20 20 70 67 6e 6f 4f 76 66  e = 0;.  pgnoOvf
36d60 6c 20 3d 20 30 3b 0a 20 20 70 42 74 20 3d 20 70  l = 0;.  pBt = p
36d70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a  Page->pBt;..  /*
36d80 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76   At this point v
36d90 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20  ariables should 
36da0 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77  be set as follow
36db0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e  s:.  **.  **   n
36dc0 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
36dd0 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20    Total payload 
36de0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20  size in bytes.  
36df0 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20  **   pPayload   
36e00 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72          Begin wr
36e10 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65  iting payload he
36e20 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c  re.  **   spaceL
36e30 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61  eft          Spa
36e40 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  ce available at 
36e50 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50  pPayload.  If nP
36e60 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74  ayload>spaceLeft
36e70 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ,.  **          
36e80 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
36e90 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d   means content m
36ea0 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f  ust spill into o
36eb0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
36ec0 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20   **   *pnSize   
36ed0 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66           Size of
36ee0 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20   the local cell 
36ef0 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76  (not counting ov
36f00 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20  erflow pages).  
36f10 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20  **   pPrior     
36f20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f          Where to
36f30 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20   write the pgno 
36f40 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
36f50 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a  rflow page.  **.
36f60 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20    ** Use a call 
36f70 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
36f80 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79  lPtr() to verify
36f90 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
36fa0 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65   above.  ** were
36fb0 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63   computed correc
36fc0 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  tly..  */.#ifdef
36fd0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
36fe0 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
36ff0 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  nfo;.    pPage->
37000 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
37010 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
37020 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65  .    assert( nHe
37030 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f  ader==(int)(info
37040 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
37050 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
37060 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d  ( info.nKey==pX-
37070 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73  >nKey );.    ass
37080 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20  ert( *pnSize == 
37090 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20  info.nSize );.  
370a0 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c    assert( spaceL
370b0 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  eft == info.nLoc
370c0 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  al );.  }.#endif
370d0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
370e0 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68   payload into th
370f0 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64  e local Cell and
37100 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20   any extra into 
37110 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a  overflow pages *
37120 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
37130 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
37140 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
37150 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
37160 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
37170 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
37180 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
37190 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
371a0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
371b0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
371c0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
371d0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
371e0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
371f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
37200 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
37210 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
37220 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
37230 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
37240 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
37250 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
37260 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
37270 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
37280 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
37290 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
372a0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
372b0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
372c0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
372d0 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
372e0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
372f0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
37300 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
37310 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
37320 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
37330 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 3d 6e  .    if( nSrc>=n
37340 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
37350 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
37360 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   n);.    }else i
37370 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
37380 20 20 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20     n = nSrc;.   
37390 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
373a0 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
373b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
373c0 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
373d0 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
373e0 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
373f0 20 20 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64      if( nPayload
37400 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  <=0 ) break;.   
37410 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
37420 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
37430 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
37440 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
37450 3b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  ;.    if( spaceL
37460 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eft==0 ){.      
37470 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
37480 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
37490 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
374a0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
374b0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
374c0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
374d0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
374e0 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
374f0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
37500 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
37510 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
37520 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
37530 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
37540 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
37550 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
37560 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
37570 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
37580 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
37590 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
375a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
375b0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
375c0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
375d0 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
375e0 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
375f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
37600 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
37610 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
37620 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
37630 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
37640 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
37650 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
37660 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
37670 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
37680 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
37690 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
376a0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
376b0 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
376c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
376d0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
376e0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
376f0 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
37700 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
37710 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
37720 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
37730 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
37740 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
37750 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
37760 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
37770 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
37780 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
37790 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
377a0 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
377b0 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
377c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75  initialized valu
377d0 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
377e0 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
377f0 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
37800 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
37810 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
37820 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
37830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37840 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
37850 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
37860 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
37870 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
37880 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
37890 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
378a0 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
378b0 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
378c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
378d0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
378e0 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
378f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37900 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
37910 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
37920 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
37930 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
37940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
37950 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
37960 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
37970 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
37980 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
37990 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
379a0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
379b0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
379c0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
379d0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
379e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
379f0 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
37a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
37a10 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
37a20 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
37a30 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
37a40 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
37a50 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
37a60 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
37a70 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
37a80 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
37a90 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
37aa0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
37ab0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
37ac0 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
37ad0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
37ae0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
37af0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
37b00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
37b10 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
37b20 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
37b30 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
37b40 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
37b50 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
37b60 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
37b70 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
37b80 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
37b90 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
37ba0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
37bb0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
37bc0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
37bd0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
37be0 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
37bf0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
37c00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
37c10 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
37c20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
37c30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
37c40 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
37c50 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
37c60 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
37c70 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
37c80 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
37c90 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
37ca0 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
37cb0 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
37cc0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
37cd0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
37ce0 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
37cf0 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
37d00 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
37d10 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
37d20 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
37d30 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
37d40 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
37d50 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
37d60 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
37d70 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
37d80 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
37d90 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
37da0 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
37db0 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
37dc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
37dd0 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
37de0 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
37df0 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
37e00 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
37e10 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
37e20 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
37e30 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
37e40 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
37e50 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
37e60 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
37e70 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
37e80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
37e90 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
37ea0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
37eb0 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
37ec0 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
37ed0 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
37ee0 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
37ef0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
37f00 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
37f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
37f20 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d  RRUPT_DB || sz==
37f30 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
37f40 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
37f50 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
37f60 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
37f70 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
37f80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
37f90 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
37fa0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
37fb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
37fc0 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 64  >nFree>=0 );.  d
37fd0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
37fe0 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
37ff0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
38000 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
38010 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
38020 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
38030 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
38040 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
38050 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
38060 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
38070 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
38080 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
38090 28 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  ( pc+sz > pPage-
380a0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
380b0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
380c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
380d0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
380e0 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
380f0 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
38100 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
38110 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
38120 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
38130 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
38140 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
38150 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  Cell==0 ){.    m
38160 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
38170 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64  1], 0, 4);.    d
38180 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
38190 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
381a0 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65  ta[hdr+5], pPage
381b0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
381c0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  e);.    pPage->n
381d0 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Free = pPage->pB
381e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
381f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
38200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
38210 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d          - pPage-
38220 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20  >childPtrSize - 
38230 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  8;.  }else{.    
38240 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72  memmove(ptr, ptr
38250 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  +2, 2*(pPage->nC
38260 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20  ell - idx));.   
38270 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
38280 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
38290 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
382a0 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
382b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
382c0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
382d0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
382e0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
382f0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
38300 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
38310 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
38320 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
38330 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
38340 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
38350 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
38360 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
38370 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
38380 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
38390 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
383a0 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
383b0 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
383c0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
383d0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
383e0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
383f0 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
38400 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
38410 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
38420 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
38430 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
38440 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
38450 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
38460 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
38470 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
38480 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
38490 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
384a0 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
384b0 72 66 6c 6f 77 20 69 73